J'ai essayé d'utiliser Pandoc pour convertir du Markdown en un fichier PDF. Voici un exemple que Pandoc ne convertira pas pour moi:
# Header!
## Sub Header
themselves derived respectively from the Greek ἀναρχία i.e. 'anarchy'
C'est juste quelque chose que j'ai attrapé en haut du vidage de la base de données wikipedia. Pandoc n'aime pas ça du tout. Voici le message d'erreur qu'il me donne:
pandoc: Error producing PDF from TeX source.
! Package inputenc Error: Unicode char \u8:ἀ not set up for use with LaTeX.
See the inputenc package documentation for explanation.
Type H <return> for immediate help.
...
l.53 ...es derived respectively from the Greek ἀ
Existe-t-il un commutateur de commande que je peux lui donner pour contourner ce problème? J'ai essayé de suivre les conseils pour faire quelque chose comme ça, mais cela a échoué:
iconv -t utf-8 test.md | pandoc -o test.pdf
Mise à jour Avant de suivre les conseils de John ci-dessous, voir ceci .
Mise à jour 2 C'est la commande qui l'a finalement fait fonctionner. J'espère que cela aidera quelqu'un:
pandoc test2.md -o test2.pdf --latex-engine=xelatex --template=my.latex --variable mainfont="DejaVu Serif" --variable sansfont=Arial
Et voici le contenu de my.latex
:
\documentclass[$if(fontsize)$$fontsize$,$endif$$if(lang)$$lang$,$endif$$if(papersize)$$papersize$,$endif$]{$documentclass$}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{amssymb,amsmath}
\usepackage{ifxetex,ifluatex}
\usepackage{fixltx2e} % provides \textsubscript
% use microtype if available
\IfFileExists{microtype.sty}{\usepackage{microtype}}{}
% use upquote if available, for straight quotes in verbatim environments
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
\usepackage[utf]{inputenc}
\usepackage{ucs}
$if(euro)$
\usepackage{eurosym}
$endif$
\else % if luatex or xelatex
\usepackage{fontspec}
\ifxetex
\usepackage{xltxtra,xunicode}
\fi
\defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase}
\setromanfont{TeX Gyre Pagella}
\newcommand{\euro}{€}
$if(mainfont)$
\setmainfont{$mainfont$}
$endif$
$if(sansfont)$
\setsansfont{$sansfont$}
$endif$
$if(monofont)$
\setmonofont{$monofont$}
$endif$
$if(mathfont)$
\setmathfont{$mathfont$}
$endif$
\fi
$if(geometry)$
\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
$endif$
$if(natbib)$
\usepackage{natbib}
\bibliographystyle{plainnat}
$endif$
$if(biblatex)$
\usepackage{biblatex}
$if(biblio-files)$
\bibliography{$biblio-files$}
$endif$
$endif$
$if(listings)$
\usepackage{listings}
$endif$
$if(lhs)$
\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}
$endif$
$if(highlighting-macros)$
$highlighting-macros$
$endif$
$if(verbatim-in-note)$
\usepackage{fancyvrb}
$endif$
$if(tables)$
\usepackage{longtable}
$endif$
$if(graphics)$
\usepackage{graphicx}
% We will generate all images so they have a width \maxwidth. This means
% that they will get their normal width if they fit onto the page, but
% are scaled down if they would overflow the margins.
\makeatletter
\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth
\else\Gin@nat@width\fi}
\makeatother
\let\Oldincludegraphics\includegraphics
\renewcommand{\includegraphics}[1]{\Oldincludegraphics[width=\maxwidth]{#1}}
$endif$
\ifxetex
\usepackage[setpagesize=false, % page size defined by xetex
unicode=false, % unicode breaks when used with xetex
xetex]{hyperref}
\else
\usepackage[unicode=true]{hyperref}
\fi
\hypersetup{breaklinks=true,
bookmarks=true,
pdfauthor={$author-meta$},
pdftitle={$title-meta$},
colorlinks=true,
urlcolor=$if(urlcolor)$$urlcolor$$else$blue$endif$,
linkcolor=$if(linkcolor)$$linkcolor$$else$Magenta$endif$,
pdfborder={0 0 0}}
\urlstyle{same} % don't use monospace font for urls
$if(links-as-notes)$
% Make links footnotes instead of hotlinks:
\renewcommand{\href}[2]{#2\footnote{\url{#1}}}
$endif$
$if(strikeout)$
\usepackage[normalem]{ulem}
% avoid problems with \sout in headers with hyperref:
\pdfstringdefDisableCommands{\renewcommand{\sout}{}}
$endif$
\setlength{\parindent}{0pt}
\setlength{\parskip}{6pt plus 2pt minus 1pt}
\setlength{\emergencystretch}{3em} % prevent overfull lines
$if(numbersections)$
$else$
\setcounter{secnumdepth}{0}
$endif$
$if(verbatim-in-note)$
\VerbatimFootnotes % allows verbatim text in footnotes
$endif$
$if(lang)$
\ifxetex
\usepackage{polyglossia}
\setmainlanguage{$mainlang$}
\else
\usepackage[$lang$]{babel}
\fi
$endif$
$for(header-includes)$
$header-includes$
$endfor$
$if(title)$
\title{$title$}
$endif$
\author{$for(author)$$author$$sep$ \and $endfor$}
\date{$date$}
\begin{document}
$if(title)$
\maketitle
$endif$
$for(include-before)$
$include-before$
$endfor$
$if(toc)$
{
\hypersetup{linkcolor=black}
\setcounter{tocdepth}{$toc-depth$}
\tableofcontents
}
$endif$
$body$
$if(natbib)$
$if(biblio-files)$
$if(biblio-title)$
$if(book-class)$
\renewcommand\bibname{$biblio-title$}
$else$
\renewcommand\refname{$biblio-title$}
$endif$
$endif$
\bibliography{$biblio-files$}
$endif$
$endif$
$if(biblatex)$
\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$
$endif$
$for(include-after)$
$include-after$
$endfor$
\end{document}
Utilisez le --pdf-engine=xelatex
option.
Par défaut, Pandoc utilise le moteur pdflatex
lors de la conversion du fichier de démarque en fichiers pdf. pdflatex
ne peut pas gérer les caractères Unicode très facilement comme xelatex
. Vous devriez plutôt essayer xelatex
. Mais , il ne suffit pas d'utiliser simplement la commande xelatex
. Comme c'est souvent le cas, vous devez choisir une police appropriée qui contient des glyphes pour les caractères Unicode que vous souhaitez composer.
Je suis un utilisateur chinois, alors prenez le chinois par exemple. Si tu as un test.md
qui contient le contenu suivant:
你好 汉字
vous pouvez utiliser la commande suivante pour compiler ce fichier de démarque:
pandoc --pdf-engine=xelatex -V CJKmainfont="KaiTi" test.md -o test.pdf
Dans la commande ci-dessus, --pdf-engine=xelatex
est utilisé pour sélectionner le moteur LaTeX (pour la nouvelle version de Pandoc, --latex-engine
option est déconseillée ). -V CJKmainfont="KaiTi"
est utilisé pour sélectionner la police appropriée qui prend en charge le chinois. Pour les autres langues, vous pouvez utiliser l'indicateur -C mainfont="<FONT_NAME>"
.
Afin de trouver une police qui prend en charge votre langue, vous devez connaître votre code de langue . Ensuite, si vous êtes sur un système Linux ou sur des systèmes Windows avec TeX Live installé. Vous pouvez utiliser la commande suivante pour trouver une police valide pour votre langue:
fc-list :lang=zh #find the font which support Chinese (language code is `zh`)
La sortie sur mon système Linux est montrée ci-dessous
Si vous choisissez d'utiliser, par exemple la police Source Han Serif CN
, puis utilisez la commande suivante pour compiler votre fichier de démarque:
pandoc --pdf-engine=xelatex -V CJKmainfont="Source Han Serif CN" test.md -o test.pdf
Revenons à ce poste dans cinq ans et le problème est toujours là. La commande
pandoc -s test.md -t latex -o test.pdf
échoue lorsque test.md
contient du texte avec des caractères non latins, grec, cyrillique, CJK, hébreu et arabe inclus.
LaTeX a été conçu avant Unicode et sa prise en charge de différents jeux de caractères est robuste dans certains domaines mais loin d'être complète, donc les conseils pour utiliser XeLaTeX sont valides mais nécessitent de choisir soigneusement la police principale, car il n'y a pas de choix automatique.
Vous trouverez ci-dessous une petite taxonomie des problèmes possibles et quelques solutions. Tous testés avec Pandoc 1.19 .
La prise en charge de l'alphabet cyrillique dans LaTeX est fournie via l'encodage de police T2A.
Prenons un petit échantillon:
# Header
## Subheader
Tetris (Russian: Тетрис) quoting Wikipedia is a tile-matching puzzle
video game
L'exécution de cet exemple avec pandoc échouerait avec:
! Package inputenc Error: Unicode char Т (U+422)
(inputenc) not set up for use with LaTeX.
See the inputenc package documentation for explanation.
Un correctif est disponible car l'option fontenc
est une variable prédéfinie dans default.latex
modèle.
Exécuter cet exemple avec
pandoc -t latex -o tetris.pdf -V fontenc=T2A cyrillic.md
produirait un rendu correct
Cependant, cela ne gérerait pas correctement les autres fonctionnalités du langage telles que la césure. Une meilleure façon serait d'utiliser Babel et de lui faire sélectionner le bon codage de police.
pandoc -t latex -o tetris.pdf -V lang -V babel-lang=russian cyrillic.md
Ou pour changer de langue avec les commandes Babel dans Markdown
# Header
## Subheader
Tetris (Russian: \foreignlanguage{russian}{Тетрис}) quoting Wikipedia
is a tile-matching puzzle video game
Et courir avec
pandoc -t latex -o tetris.pdf -V lang -V babel-lang=english \
-V babel-otherlangs=russian cyrillic2.md
L'exemple dans la publication d'origine contient des caractères des pages de codes grecques Unicode principal et étendu.
Quoi qu'il en soit, l'encodage de polices grecques LGR largement utilisé n'est pas couvert par le projet LaTeX 3 et est classé comme un encodage local, c'est-à-dire qu'il peut varier d'un site à l'autre et d'un système à l'autre selon le - Guide d'encodage LaTeX .
Sur TeX Live, les packages suivants doivent être installés: texlive-greek-inputenc
, texlive-greek-fontenc
et texlive-cbfonts
. Notez que vous avez besoin de Babel 3.9 ou version ultérieure. Cependant, le résultat de
pandoc -t latex -o anarchy.pdf -V fontenc=LGR greek.md
peut paraître inattendu.
Afin de corriger ce problème, il faut configurer correctement le paquet LaTeX Babel. Et insérez des commandes pour basculer entre les langues dans le texte d'origine:
# Header!
## Sub Header
themselves derived respectively from the Greek \textgreek{ἀναρχία}
i.e. 'anarchy'
Compiler ceci avec la commande suivante
pandoc -s greek2.md -t latex -V fontenc=T2A -V lang -V babel-lang=english \
-V babel-otherlangs=greek -o greek.pdf
produirait la sortie exactement comme vous vous y attendez:
Tout cela ne serait pas nécessaire si nous utilisions XeLaTeX.
Exécution de l'exemple d'origine avec
pandoc -s greek.md --latex-engine=xelatex -t latex -o greek.pdf
produirait
Parce que la police ne contient rien dans les positions des caractères grecs, la sortie contient à la place un espace blanc.
La sélection de l'une des polices les plus utilisées comme nouveau mainfont
aiderait un peu
pandoc -s greek.md --latex-engine=xelatex \
-V mainfont="Liberation Serif" -t latex -o greek.pdf
Cependant, les caractères de la page de code grecque étendue tels que la petite lettre alpha avec accent psili ne sont pas rendus.
Le Configuration des polices pour le grec avec XeTeX/LuaTeX Guide suggère d'utiliser les familles de polices DejaVu, Libertine ou Free.
En effet avec DejaVu Serif
, Linux Libertine O
ainsi que Tempora
et peut-être d'autres polices, le résultat serait comme prévu. Voir ci-dessous le rendu avec les polices XeLaTeX et Linux Libertine.
pandoc -s greek.md --latex-engine=xelatex -V mainfont="Linux Libertine O" \
-t latex -o greek.pdf
Si vous utilisez la sortie intermédiaire LaTeX, vous pouvez utiliser inline \mbox{t\'ext}
pour obtenir des caractères accentués. Sans le \mbox{}
, la barre oblique inverse n'est souvent pas interprétée correctement par l'analyseur Pandoc.
J'ai eu un problème similaire en essayant d'obtenir des symboles mathématiques dans la sortie.
Comme d'autres l'ont mentionné, avec les versions récentes de pandoc (v2.2.3.2 dans mon cas), l'option à utiliser est pdf-engine=xelatex
. Je n'ai pas eu besoin de spécifier de police dans ce cas:
pandoc -o MyDoc.pdf --pdf-engine=xelatex MyDoc.md
J'ai eu une erreur indiquant que la police latinmodern-math était manquante. Je l'ai installé en utilisant:
tlmgr install collection-fontsrecommended
Vous pouvez utiliser --latex-engine=xelatex
, comme dit précédemment, mais le mieux que j'ai trouvé est d'utiliser la variable lang
pour spécifier la langue du document dans l'en-tête, comme ceci: lang: ru-RU
. Un exemple de travail sur ma station de travail Debian:
---
title: Lady Macbeth de Mzensk (Chostakovitch, livret d'Alexandre Preis, 1934)
lang: ru-RU
---
# Acte I / Tableau 1
*[Народ ненадежный]*
Ха, ха, ха, ха, ха, ха, ха. *[...]* Чуыствуем
На кого ты нас покидаешь?
Без хозяина будет скучно,
скучно, тоскливо, безрадостно.
Не работа. Без тебя невеселье. Воз вращайся
Как можно скорей, скорей !
Ensuite, vous pouvez lancer:
$ pandoc -o your-file-output.pdf your-source-file.md
Fonctionne pour les caractères cyrilliques
pandoc myfile.md --pdf-engine=xelatex -V mainfont=Arial