Solución lista markdown2pdf con código fuente para Linux

Prólogo

Markdown es una excelente manera de escribir un artículo breve y, a veces, un texto bastante extenso, con un formato simple en forma de cursiva y negrita. Además, Markdown es bueno para escribir artículos que incluyen código fuente. Pero a veces se desea convertirlo, sin pérdidas y sin complicaciones, en un archivo PDF bien formateado, y que no haya problemas durante la conversión, como los que yo he tenido, por ejemplo, no se puede escribir en ruso en los comentarios del código fuente, las líneas demasiado largas no se envían a la siguiente línea, sino que se cortan, y otros pequeños problemas. Las instrucciones permitirán configurar rápidamente el conversor. md2pdf sin necesidad de entender cómo funciona. El script para una instalación más o menos automática se encuentra a continuación en la sección correspondiente.

Mi ejemplo de plantilla TeX para la conversión utiliza el paquete de fuentes PSCyr, que incluye soporte para las fuentes de Microsoft, específicamente Times New Roman. Así eran los requisitos para el diploma según las normas GOST. Si puedes, puedes modificar la plantilla a tus necesidades. En mi caso, tendré que lidiar previamente con la configuración de PSCyr en TexLive. La configuración se realiza en la distribución de Linux Mint Mate, para otras distribuciones, puede que necesites buscar en Google las carpetas estándar del paquete TexLive para tu sistema.

Instalación de TexLive

Por supuesto, puedes instalar solo las partes necesarias de este paquete. Pero personalmente, me daba pereza buscar una instalación mínima necesaria. Para que todo funcione correctamente, instalamos todo el paquete TexLive. Se llama texlive-full y ocupa un poco más de 2 gigabytes, ten esto en cuenta. Ejecutamos el comando:

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

Después de una instalación bastante larga, podemos pasar al siguiente punto.

Instalación del conversor Pandoc

Pandoc es un paquete de Linux que permite convertir algunos formatos de texto en otros. Tiene muchas funciones interesantes, que puedes explorar tú mismo en Internet. A nosotros solo nos interesa la capacidad de convertir un archivo markdown en PDF. Verificamos si Pandoc está instalado y, si no lo está, lo instalamos. Por ejemplo, así:

user@hostname:~$ dpkg -s pandoc

Si en la salida dice que no está instalado, lo instalamos:

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

Instalación del paquete PSCyr para TexLive

Primero necesitas descargar PSCyr. Hasta ahora, todavía está disponible en esta el enlace, si al momento de leer este artículo, por alguna razón no está disponible, no te desanimes, es fácil encontrarlo junto con las instrucciones de instalación, buscando en Google algo como «Instalación PsCyr texlive». Si está disponible, es más sencillo para ti, descárgalo y asumamos que has descomprimido el archivo en tu carpeta de inicio y, por lo tanto, la ruta a la carpeta contenida en el archivo es ~/PSCyr. Entonces, abrimos la Terminal y ejecutamos los siguientes comandos:

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

Luego averiguamos dónde se encuentra el directorio local texmf. Ejecutamos el comando:

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

Es probable que este directorio sea /usr/local/share/texmf/, y luego ejecutamos:

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

O puedes evitar problemas y ejecutar el comando que copiará en la carpeta texmf dondequiera que esté:

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

Las fuentes PSCyr están instaladas, las conectamos en TexLive:

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

Plantilla LaTeX para convertir md2pdf

No voy a describir cómo está configurada esta plantilla y simplemente la presentaré en un spoiler sin muchas explicaciones. Basta decir que está bastante bien configurada, al menos en cómo procesa textos con mucho código fuente. Si no estás satisfecho con los tamaños de los márgenes, los interlineados, la falta de numeración de secciones y subsecciones, creo que es bastante fácil buscar en Internet la pregunta «cómo hacer en Latex…» y seguir con lo que necesitas. Si tienes dudas, escribe en los comentarios, intentaré recordar mis configuraciones de hace 4 años y explicarte qué línea de la plantilla corresponde a qué. Por ahora, describiré cómo lo hice en mi PC, y tú eres libre de repetir o modificarlo a tu gusto.

Creamos el archivo template.tex en el directorio /usr/share/texlive/:

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

Le damos permisos de lectura:

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

lo abrimos como root e insertamos en él el contenido oculto en el spoiler a continuación:

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

Contenido de la plantilla /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}

Guardamos el archivo /usr/share/texlive/template.tex y escribimos un script que convertirá un archivo Markdown a PDF, creando en la misma carpeta un archivo con el nombre del archivo Markdown con el sufijo .pdf, es decir, después de la conversión filename.md aparecerá en la carpeta filename.md.pdf. Llamaremos al script md2pdf y lo colocaremos en el camino /usr/bin. Ejecutaremos las siguientes comandos:

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

En la cuarta línea, se indica el comando de conversión. Tenga en cuenta —from=markdown_github. La versión de GitHub de Markdown es retrocompatible con el Markdown original, así que si tu texto está escrito en él, no hay de qué preocuparse. Si tu archivo MD está escrito en un dialecto específico de Markdown, consulta la guía de Pandoc (man pandoc), asegúrate de que tu implementación sea compatible y ajusta /usr/bin/md2pdf si es necesario.

Script para una instalación más o menos automática

Si no deseas configurar nada en absoluto, y tienes una distribución similar a Ubuntu, puedes intentar crear un script con el contenido escondido bajo el spoiler, y probablemente todo se instalará solo; lo único es que debes copiar el plantilla de TeX que se encuentra bajo el spoiler anterior al lugar adecuado. Abre la Terminal y ejecuta:

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

Luego, rellena con el siguiente contenido:

Contenido del 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

Ejecuta usando el comando:

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

No olvides que /usr/share/texlive/template.tex debes rellenar con el contenido indicado en la sección «Plantilla LaTeX para convertir md2pdf».

Uso de md2pdf

Simplemente abre la carpeta con el archivo Markdown (some_file.md) en la Terminal y ejecuta el comando:

user@hostname:~$ md2pdf some_file.md

Como resultado, aparecerá un archivo en la carpeta some_file.md.pdf.

Conclusión

Basado en el método descrito, se puede construir cualquier estilo de archivos PDF; también se pueden convertir otros formatos además de md, cualquier formato compatible con Pandoc. Espero que algún día esta instrucción sea útil para tres personas y media.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster