Pandoc et caractères étrangers

J’ai essayé d’utiliser Pandoc pour convertir certains Markdown dans un fichier PDF. Voici un exemple que Pandoc ne convertira pas pour moi:

# Header! ## Sub Header themselves derived respectively from the Greek ἀναρχία ie 'anarchy' 

C’est juste quelque chose que j’ai saisi en haut de la firebase database Wikipédia. Pandoc n’aime pas ça du tout. C’est 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  for immediate help. ... l.53 ...es derived respectively from the Greek ἀ 

Y a-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 ça a échoué:

 iconv -t utf-8 test.md | pandoc -o test.pdf 

Mise à jour Avant de suivre les conseils de John ci-dessous, voyez ceci .

Mise à jour 2 C’est la commande qui a finalement fonctionné. 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 my.latex 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(ssortingkeout)$ \usepackage[normalem]{ulem} % avoid problems with \sout in headers with hyperref: \pdfssortingngdefDisableCommands{\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 l’ --latex-engine=xelatex .

Par défaut, Pandoc utilise le moteur pdflatex lors de la conversion du fichier markdown en fichiers pdf. pdflatex ne peut pas gérer les caractères Unicode en douceur comme xelatex . Vous devriez essayer xelatex place. Mais , utiliser xelatex commande xelatex ne suffit pas. 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 vous avez un test.md qui contient le contenu suivant:

你好 汉字

vous pouvez utiliser la commande suivante pour comstackr ce fichier markdown:

 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, l’ option --latex-engine est obsolète ). -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 le drapeau -C mainfont="" .

Comment trouver une police qui prend en charge votre langue

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 illustrée ci-dessous entrer la description de l'image ici

Si vous choisissez d’utiliser, par exemple, la police Source Han Serif CN , utilisez la commande suivante pour comstackr votre fichier markdown:

  pandoc --pdf-engine=xelatex -V CJKmainfont="Source Han Serif CN" test.md -o test.pdf 

Si vous utilisez une sortie intermédiaire LaTeX, vous pouvez utiliser \mbox{t\'ext} inline pour obtenir des caractères accentués. Sans la \mbox{} , la barre oblique inverse n’interprète souvent pas correctement la barre oblique inverse.

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, le conseil d’utilisation de XeLaTeX est valable, mais il faut choisir la police principale.

Vous trouverez ci-dessous une petite taxonomie des problèmes possibles et de certaines solutions. Tous testés avec Pandoc 1.19 .

cyrillique

La prise en charge de l’alphabet cyrillique dans LaTeX est assurée par l’encodage de fonts T2A.

Prenons un petit échantillon:

 # Header ## Subheader Tesortings (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 le modèle default.latex .

Exécuter cet exemple avec

 pandoc -t latex -o tesortings.pdf -V fontenc=T2A cyrillic.md 

produirait un rendu correct

Texte avec caractères cyrilliques rendus correctement

Cela ne permettrait toutefois pas de gérer correctement les autres fonctionnalités du langage, telles que la césure. Un meilleur moyen serait d’utiliser Babel et de sélectionner l’encodage correct de la police.

 pandoc -t latex -o tesortings.pdf -V lang -V babel-lang=russian cyrillic.md 

Ou pour changer de langue avec les commandes Babel dans Markdown

 # Header ## Subheader Tesortings (Russian: \foreignlanguage{russian}{Тетрис}) quoting Wikipedia is a tile-matching puzzle video game 

Et courir avec

 pandoc -t latex -o tesortings.pdf -V lang -V babel-lang=english \ -V babel-otherlangs=russian cyrillic2.md 

grec

L’exemple dans le message d’origine contient des caractères provenant des pages de code Unicode grecques principales et étendues.

Quoi qu’il en soit, l’encodage des fonts 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 de codage LaTeX .

Sur TeX Live, les paquets suivants doivent être installés: texlive-greek-inputenc , texlive-greek-fontenc et texlive-cbfonts . Notez que vous avez besoin de Babel 3.9 ou plus tard . Cependant le résultat de

 pandoc -t latex -o anarchy.pdf -V fontenc=LGR greek.md 

peut sembler inattendu.

Texte avec caractères grecs et latins en grec

Pour corriger ce problème, il faut configurer correctement le package LaTeX Babel. Et insérer des commandes pour basculer entre les langues dans le texte d’origine:

 # Header! ## Sub Header themselves derived respectively from the Greek \textgreek{ἀναρχία} ie 'anarchy' 

Comstackr ceci avec la commande suivante

 pandoc -s greek2.md -t latex -V lang -V babel-lang=english \ -V babel-otherlangs=greek -o greek.pdf 

produirait la sortie exactement comme vous vous en doutez:

Texte avec des caractères grecs rendus correctement

XeLaTeX

Tout cela ne serait pas nécessaire si nous utilisions XeLaTeX.

Exécuter juste l’exemple original avec

 pandoc -s greek.md --latex-engine=xelatex -t latex -o greek.pdf 

produirait

Texte avec caractères grecs omis

Comme la police ne contient rien dans les caractères grecs, la sortie contient plutôt des espaces blancs.

La sélection d’une des fonts les plus populaires comme la nouvelle mainfont aiderait un peu

 pandoc -s greek.md --latex-engine=xelatex \ -V mainfont="Liberation Serif" -t latex -o greek.pdf 

Texte avec uniquement des caractères grecs de base rendus correctement

Cependant, les caractères de la page de code en grec étendue tels que la petite lettre alpha avec un accent psili ne sont pas rendus.

La configuration des fonts pour le grec avec XeTeX / LuaTeX Guide suggère d’utiliser les familles de fonts DejaVu, Libertine ou Free.

En effet avec DejaVu Serif , Linux Libertine O ainsi que Tempora et peut-être quelques autres fonts, le résultat serait comme prévu. Voir ci-dessous le rendu avec les fonts XeLaTeX et Linux Libertine.

 pandoc -s greek.md --latex-engine=xelatex -V mainfont="Linux Libertine O" \ -t latex -o greek.pdf 

Texte avec caractères grecs rendus correctement avec les polices XeLaTeX et Libertine