Kant-en-klare markdown2pdf-oplossing met broncode voor Linux

Voorwoord

Markdown is een geweldige manier om een ​​kort artikel te schrijven, en soms behoorlijk veel tekst, met eenvoudige cursieve en vetgedrukte opmaak. Markdown is ook goed voor het schrijven van artikelen met broncode. Maar soms wil je zonder verlies dansen met een tamboerijn om het in te halen in een normaal, goed gevormd pdf-bestand, en zodat er geen problemen zijn tijdens de conversie, wat ik bijvoorbeeld had - je kunt niet in het Russisch schrijven in de commentaren van de broncode, te lange regels worden niet overgenomen, maar geknipt en andere kleine problemen. Met de instructie kunt u de converter snel instellen md2pdf zonder echt te begrijpen hoe het werkt. Het script voor een min of meer automatische installatie staat hieronder in de daarvoor bestemde sectie.

Mijn voorbeeld TeX-sjabloon voor conversie gebruikt het PSCyr-lettertypepakket, dat ondersteuning biedt voor Microsoft-lettertypen, namelijk Times New Roman. Er waren dergelijke vereisten voor een diploma volgens GOST. Als u weet hoe, kunt u de sjabloon aanpassen aan uw behoeften. In mijn eigen instructies zul je eerst moeten rommelen met de PSCyr-instelling in TexLive. De installatie gebeurt in de Linux Mint Mate-distributie, voor andere distributies moet u mogelijk de standaard TexLive-pakketmappen voor uw systeem googlen.

TexLive installeren

U kunt natuurlijk alleen de benodigde onderdelen van dit pakket installeren. Maar persoonlijk was ik eerlijk gezegd te lui om te zoeken naar de minimaal noodzakelijke werkende installatie. Installeer het volledige TexLive-pakket om er zeker van te zijn dat alles werkt. Het heet texlive-vol en weegt iets meer dan 2 gigabyte, houd hier rekening mee. We voeren de opdracht uit:

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

Na een voldoende lange installatie kunt u doorgaan naar het volgende item.

De Pandoc-converter installeren

Pandoc is een Linux-pakket waarmee je sommige tekstindelingen naar andere kunt converteren. Het heeft veel interessante functies die u op internet kunt vinden. We zijn alleen geïnteresseerd in de mogelijkheid om een ​​markdown-bestand naar PDF te converteren. Controleer of Pandoc is geïnstalleerd en zo niet, installeer het dan. Bijvoorbeeld zo:

user@hostname:~$ dpkg -s pandoc

Als de uitvoer zegt dat het niet is geïnstalleerd, installeer dan:

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

Installatie van het PSCyr-pakket voor TexLive

Eerst moet je PSCyr downloaden. Voorlopig is het hier nog steeds beschikbaar link, als het op het moment van lezen van het artikel om de een of andere reden niet beschikbaar is, wanhoop niet, het is gemakkelijk om het samen met de installatie-instructies te vinden door zoiets als "PsCyr texlive installeren" in Google te typen. Als het beschikbaar is, dan is het gemakkelijker voor u, download en we gaan ervan uit dat u het archief in uw thuismap hebt uitgepakt en dat het pad naar de map in het archief er dus uitziet ~/PSCjr. Ga vervolgens naar de Terminal en voer achtereenvolgens de volgende opdrachten uit:

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

Zoek vervolgens uit waar de lokale map zich bevindt tekstmf. We voeren de opdracht uit:

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

Hoogstwaarschijnlijk heb je deze map - /usr/local/share/texmf/, en dan doen we:

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

Welnu, of u kunt niet de moeite nemen en een opdracht uitvoeren die naar een map zal kopiëren tekstmf waar ze ook is:

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

PSCyr-lettertypen geïnstalleerd, maak verbinding met TexLive:

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

LaTeX-sjabloon voor md2pdf-conversie

Ik zal niet precies beschrijven hoe dit sjabloon is geconfigureerd, en zal het zonder veel uitleg gewoon onder de spoiler geven. Het volstaat te zeggen dat het goed is geconfigureerd, althans wat betreft hoe het omgaat met teksten met veel broncode. Als je niet tevreden bent met de grootte van de inspringingen, de regelafstand, het ontbreken van nummering van secties en subsecties, dan is het naar mijn mening vrij eenvoudig om de vraag op internet te googelen "hoe doe je dat in Latex ..." en dan uw behoefte. Als het helemaal niet duidelijk is, schrijf dan in de comments, ik zal proberen 4 jaar geleden in mijn eigen instellingen te duiken en te beschrijven welke regel van de sjabloon waarvoor verantwoordelijk is. In de tussentijd zal ik opschrijven hoe ik het op mijn pc heb gedaan, en je bent vrij om het voor jezelf te herhalen of aan te passen.

Maak een bestand aan sjabloon.tex in de catalogus /usr/delen/texlive/:

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

Geef het leesrechten:

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

open het onder de root en plak de inhoud verborgen onder de spoiler eronder erin:

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

Sjablooninhoud /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}

Bewaar het bestand /usr/share/texlive/template.tex en schrijf een script dat het Makrdown-bestand naar PDF zal converteren, waarbij in dezelfde map een bestand wordt gemaakt met de naam het Markdown-bestand met het voorvoegsel .pdf, dat wil zeggen, na de conversie bestandsnaam.md verschijnt in de map. bestandsnaam.md.pdf. Laten we het script noemen md2pdf en onderweg gezet / Usr / bin. Laten we de commando's in volgorde uitvoeren:

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

De 4e regel bevat eigenlijk het conversiecommando. Let op --from=markdown_github. De GitHub-versie van Markdown is achterwaarts compatibel met de originele Markdown, dus als uw tekst erin is geschreven, hoeft u zich geen zorgen te maken. Als uw MD-bestand in een specifiek Markdown-dialect is geschreven, lees dan de Pandoc-handleiding (man pandoc), zorg ervoor dat uw implementatie erdoor wordt ondersteund en pas aan /usr/bin/md2pdf indien nodig.

Script voor min of meer automatische installatie

Als je eigenlijk helemaal niets wilt configureren en je hebt een Ubuntu-achtige distributie, kun je proberen een script te maken met de inhoud verborgen onder de spoiler, en hoogstwaarschijnlijk zal alles zichzelf installeren, het enige is kopiëren de TeX-template geplaatst onder de spoiler hierboven waar nodig zelf. Open Terminal en voer uit:

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

Vul het dan met de volgende inhoud:

De inhoud van het script $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

Voer het uit met het commando:

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

Vergeet dat niet /usr/share/texlive/template.tex moet worden ingevuld zoals aangegeven in de sectie "LaTeX-sjabloon voor md2pdf-conversie" inhoud.

md2pdf gebruiken

Open gewoon de map met het Markdown-bestand (een_bestand.md) in de Terminal en voer de opdracht uit:

user@hostname:~$ md2pdf some_file.md

Als gevolg hiervan verschijnt er een bestand in de map een_bestand.md.pdf.

Conclusie

Op basis van de beschreven methode kunt u elke stijl PDF-bestanden bouwen, u kunt ook andere formaten converteren in plaats van md, elk ondersteund door Pandoc. Ik durf te hopen dat deze instructie op een dag nuttig zal zijn voor 3 en een half mensen.

Bron: www.habr.com

Voeg een reactie