web-dev-qa-db-fra.com

Pandoc et personnages étrangers

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}
55
Mike Thomsen

Utilisez le --pdf-engine=xelatex option.

30
John MacFarlane

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>".

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 montrée ci-dessous enter image description here

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
9
jdhao

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 .

Cyrillique

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

Text with cyrillic characters rendered correctly

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

Grec

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.

Text with both Greek and Latin characters typed as Greek

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:

Text with greek characters rendered correctly

XeLaTeX

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

Text with Greek characters omitted

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

Text with only basic Greek characters rendered correctly

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

Text with Greek characters rendered correctly with XeLaTeX and Libertine fonts

4
Dmitri Chubarov

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.

1
mabraham

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
0
Bampfer

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
0
Creasixtine

Fonctionne pour les caractères cyrilliques

pandoc myfile.md --pdf-engine=xelatex -V mainfont=Arial
0
itsnikolay