Пандок и иностранные персонажи

Я пытался использовать Pandoc для преобразования некоторых Markdown в файл PDF. Это образец, который Pandoc не будет преобразовывать для меня:

# Header!

## Sub Header

themselves derived respectively from the Greek ἀναρχία i.e. 'anarchy'

Это просто то, что я взял из верхней части дампа базы данных википедии. Пандоку это совсем не нравится. Это сообщение об ошибке, которое он дает мне:

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 ἀ

Есть ли командный переключатель, который я могу дать ему, чтобы обойти это? Я попытался последовать совету, чтобы сделать что-то подобное, но это не удалось:

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

Обновление Прежде чем следовать приведенным ниже советам Джона, см. это.

Обновление 2. Это команда, которая в конечном итоге заставила его работать. Надеюсь, это кому-то поможет:

pandoc test2.md -o test2.pdf --latex-engine=xelatex --template=my.latex --variable mainfont="DejaVu Serif" --variable sansfont=Arial

И это содержимое 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}

person Mike Thomsen    schedule 12.08.2013    source источник


Ответы (7)


Используйте опцию --pdf-engine=xelatex.

person John MacFarlane    schedule 12.08.2013
comment
Это создало документ, но теперь у меня есть куча пустых символов там, где должно быть греческое слово. Я думаю, это не распознавание рассматриваемых персонажей. - person Mike Thomsen; 12.08.2013
comment
Пустые символы отображаются, если у вас выбран шрифт, не содержащий греческих глифов. Используйте параметр --variable mainfont="..." в командной строке. См. johnmacfarlane.net/pandoc/demos.html, пример 14 (Xe) латекс - person z--; 25.10.2014
comment
Вместо языка CJK вы можете использовать -V CJKmainfont="...". См. ответ здесь. - person jdhao; 05.06.2018
comment
--pdf-engine - это новый вариант… - person Sardathrion - against SE abuse; 20.07.2018
comment
Вы также можете использовать переменную lang, как я описал в своем ответе. - person Creasixtine; 04.03.2019
comment
Это неполный ответ (не упоминаются шрифты) и более неправильный (следует указать --pdf-engine). - person Merchako; 23.03.2019

По умолчанию Pandoc использует механизм pdflatex при преобразовании файла уценки в файлы pdf. pdflatex не может так гладко обрабатывать символы Unicode, как xelatex. Вместо этого вам следует попробовать xelatex. Но просто использовать команду xelatex недостаточно. Как это часто бывает, вам нужно выбрать правильный шрифт, который содержит глифы для символов Юникода, которые вы хотите набрать.

Я китайский пользователь, возьмем, к примеру, китайский. Если у вас есть test.md, который содержит следующее содержимое:

你好汉字

вы можете использовать следующую команду для компиляции этого файла уценки:

pandoc --pdf-engine=xelatex -V CJKmainfont="KaiTi" test.md -o test.pdf

В приведенной выше команде --pdf-engine=xelatex используется для выбора движка LaTeX (для новой версии Pandoc, --latex-engine опция устарела). -V CJKmainfont="KaiTi" используется для выбора правильного шрифта, поддерживающего китайский язык. Для других языков вы можете использовать флаг -C mainfont="<FONT_NAME>".

Как найти шрифт, поддерживающий ваш язык

Чтобы найти шрифт, поддерживающий ваш язык, вам необходимо знать свой код языка. Затем, если вы работаете в системе Linux или в системах Windows с установленным TeX Live. Вы можете использовать следующую команду, чтобы найти правильный шрифт для вашего языка:

fc-list :lang=zh #find the font which support Chinese (language code is `zh`)

Вывод в моей системе Linux показан ниже  введите описание изображения здесь

Если вы решите использовать, например шрифт Source Han Serif CN, затем используйте следующую команду для компиляции файла уценки:

 pandoc --pdf-engine=xelatex -V CJKmainfont="Source Han Serif CN" test.md -o test.pdf
person jdhao    schedule 04.01.2018
comment
См. Pandoc с китайским языком для получения дополнительной информации. - person J3soon; 06.04.2018
comment
XD. Однако мне нужно использовать mainfont вместо CJKmainfont. - person J3soon; 07.04.2018
comment
Неверно, что pdflatex не может обрабатывать символы Юникода. - person Dmitri Chubarov; 02.06.2018
comment
@DmitriChubarov, это правда? Я не эксперт в LaTeX. Но xelatex кажется вариантом при работе с символами Юникода. - person jdhao; 02.06.2018
comment
LaTeX был разработан до Unicode, поэтому он поддерживал только 256-символьные таблицы кодирования, однако, поскольку можно было динамически переключать таблицы кодирования и шрифты под капотом, было совершенно нормально подавать кодированный ввод UTF-8 в компилятор LaTeX, перевод выполнялся такими пакетами, как inputenc и fontenc. - person Dmitri Chubarov; 02.06.2018
comment
@DmitriChubarov, спасибо за информацию. Я исправлю свой ответ. - person jdhao; 02.06.2018

ОБНОВЛЕНИЕ: ответ ниже кажется действительным для pandoc 1.x, но с более поздними версиями синтаксис изменился


Возвращаясь к этому посту через пять лет, и проблема все еще существует. Команда

pandoc -s test.md -t latex -o test.pdf

завершается ошибкой, если test.md содержит текст с нелатинскими символами, включая греческий, кириллический, CJK, иврит и арабский язык.

LaTeX был разработан до Unicode, и его поддержка различных наборов символов является надежной в некоторых областях, но далека от исчерпывающей, поэтому совет по использованию XeLaTeX действителен, но требует тщательного выбора основного шрифта, поскольку автоматический выбор отсутствует.

Ниже представлена ​​небольшая систематика возможных проблем и некоторых решений. Все протестированы с Pandoc 1.19.

Кириллица

Поддержка кириллицы в LaTeX обеспечивается кодировкой шрифтов T2A.

Рассмотрим небольшой образец:

# Header

## Subheader

Tetris (Russian: Тетрис) quoting Wikipedia is a tile-matching puzzle 
video game

Выполнение этого примера с помощью pandoc завершится ошибкой:

! Package inputenc Error: Unicode char Т (U+422)
(inputenc)                not set up for use with LaTeX.

See the inputenc package documentation for explanation.

Исправление доступно, поскольку опция fontenc - это предопределенная переменная в шаблоне default.latex.

Запуск этого примера с

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

произведет правильный рендеринг

Текст с кириллическими символами отображается правильно

Однако это не повлияет на правильную обработку других языковых функций, таких как расстановка переносов. Лучшим способом было бы использовать Babel и заставить его выбрать правильную кодировку шрифта.

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

Или переключать языки с помощью команд Babel внутри Markdown

# Header

## Subheader

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

И беги с

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

Греческий

Пример в исходном посте содержит символы как из основной, так и из расширенной кодовых страниц греческого Unicode.

В любом случае, широко используемая кодировка греческого шрифта LGR не охвачена проектом LaTeX 3 и классифицируется как локальная кодировка, то есть она может варьироваться от сайта к сайту и от системы к системе в соответствии с Руководство по кодированию LaTeX.

В TeX Live необходимо установить следующие пакеты: texlive-greek-inputenc, texlive-greek-fontenc и texlive-cbfonts. Обратите внимание, что вам нужен Babel 3.9 или новее. Однако результат

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

может показаться неожиданным.

Текст с греческими и латинскими символами, набранный как греческий

Чтобы исправить эту проблему, необходимо правильно настроить пакет LaTeX Babel. И вставляем команды для переключения между языками в исходном тексте:

# Header!

## Sub Header

themselves derived respectively from the Greek \textgreek{ἀναρχία} 
i.e. 'anarchy'

Компилируем это с помощью следующей команды

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

выдаст результат именно так, как вы ожидаете:

Текст с греческими символами отображается правильно

XeLaTeX

Все это не понадобилось бы, если бы мы использовали XeLaTeX.

Просто запустите исходный пример с

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

произвел бы

«Текст

Поскольку шрифт не содержит ничего в позициях греческих символов, вместо этого вывод содержит пробелы.

Выбор одного из популярных шрифтов в качестве нового mainfont немного поможет

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

«Текст,

Однако символы из расширенной греческой кодовой страницы, такие как строчная буква альфа с пси-ударением, не отображаются.

Настройка шрифта для греческого языка с помощью XeTeX / LuaTeX Руководство предлагает использовать семейства шрифтов DejaVu, Libertine или Free.

Действительно, с DejaVu Serif, Linux Libertine O, а также Tempora и, возможно, с некоторыми другими шрифтами результат будет таким, как ожидалось. См. Ниже рендеринг с использованием шрифтов XeLaTeX и Linux Libertine.

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

«Текст

person Dmitri Chubarov    schedule 02.06.2018
comment
Этот вариант «babel-lang» - единственное, что у меня сработало, спасибо! Это прямо не упоминается в официальной документации pandoc. - person Roman Golyshev; 12.03.2019

Работает для кириллических символов

pandoc myfile.md --pdf-engine=xelatex -V mainfont=Arial
person itsnikolay    schedule 04.06.2019

Вы можете использовать --latex-engine=xelatex, как было сказано ранее, но лучшее, что я нашел, - это использовать переменную lang для указания языка документа в заголовке, например: lang: ru-RU. Рабочий пример на моей рабочей станции debian:

---
title: Lady Macbeth de Mzensk (Chostakovitch, livret d'Alexandre Preis, 1934)
lang: ru-RU
---

# Acte I / Tableau 1

*[Народ ненадежный]*  
Ха, ха, ха, ха, ха, ха, ха. *[...]* Чуыствуем  
На кого ты нас покидаешь?  
Без хозяина будет скучно,  
скучно, тоскливо, безрадостно.

Не работа. Без тебя невеселье. Воз вращайся  
Как можно скорей, скорей !

Затем вы можете запустить:

$ pandoc -o your-file-output.pdf your-source-file.md
person Creasixtine    schedule 03.03.2019

Если вы используете промежуточный вывод LaTeX, вы можете использовать встроенный \mbox{t\'ext} для получения акцентированных символов. Без \mbox{} обратная косая черта часто неправильно интерпретируется анализатором Pandoc.

person mabraham    schedule 26.04.2016

У меня была аналогичная проблема при попытке отобразить математические символы на выходе.

Как уже упоминалось, с последними версиями pandoc (v2.2.3.2 в моем случае) можно использовать pdf-engine=xelatex. В этом случае мне не нужно было указывать шрифт:

pandoc -o MyDoc.pdf --pdf-engine=xelatex  MyDoc.md

Я получил сообщение об отсутствии шрифта latinmodern-math. Я установил его с помощью:

tlmgr install collection-fontsrecommended
person Bampfer    schedule 30.04.2019