Подтвердить что ты не робот

Pandoc и иностранные персонажи

Я пытаюсь использовать 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\[email protected]@width>\linewidth\linewidth
\else\[email protected]@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}
4b9b3361

Ответ 1

Используйте параметр --pdf-engine=xelatex.

Ответ 2

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

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

你好 汉字

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

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

В приведенной выше команде --pdf-engine=xelatex используется для выбора механизма LaTeX (для новой версии --latex-engine опция --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 показан ниже enter image description here

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

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

Ответ 3

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

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

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

Text with cyrillic characters rendered correctly

Это, однако, не будет правильно обрабатывать другие языковые функции, такие как переносы. Лучше было бы использовать 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

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

Text with both Greek and Latin characters typed as Greek

Чтобы решить эту проблему, необходимо правильно настроить пакет 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

будет производить вывод точно так, как вы ожидаете:

Text with greek characters rendered correctly

XeLaTeX

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

Просто запускаю оригинальный пример с

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

будет производить

Text with Greek characters omitted

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

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

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

Text with only basic Greek characters rendered correctly

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

Настройка шрифтов для греческого с XeTeX/LuaTeX Guide предлагает использовать семейства шрифтов 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

Text with Greek characters rendered correctly with XeLaTeX and Libertine fonts

Ответ 4

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

Ответ 5

Вы можете использовать --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

Ответ 6

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

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

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

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

tlmgr install collection-fontsrecommended

Ответ 7

Работает для кириллицы

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