pandoc не переносит блоки кода по тексту при преобразовании в pdf

Я использую pandoc с движком xelatex для преобразования уценки в pdf. Я запускаю pandoc следующим образом:

pandoc -s 'backbone-fundamentals'.md -o 'backbone-fundamentals'.pdf \
    --title-prefix 'Developing Backbone.js Applications' \
    --normalize \
    --smart \
    --toc \
    --latex-engine=`which xelatex`

Если строка кода длиннее ширины документа PDF, она просто обрезается. Есть ли способ, чтобы текст pandoc переносил длинные строки кода?


person skud    schedule 26.12.2013    source источник
comment
Это также вопрос об обертывании встроенного кода, например, длинных путей или URL-адресов, что, конечно, может иметь смысл.   -  person Wolf    schedule 04.07.2017
comment
На этот вопрос дан положительный ответ здесь: tex.stackexchange.com/q/179926/34551!   -  person Clément    schedule 26.01.2018


Ответы (2)


Отсутствие переноса текста является (частью) точки кодовых блоков. Насколько я знаю, единственный способ обернуть код вручную. Для большинства языков в любом случае считается хорошим стилем не превышать определенную длину строки.

Если ваши строки ограничены по длине, но все еще слишком длинны для вашего PDF-файла, сгенерированного LaTeX, рассмотрите возможность уменьшения размера шрифта для блоков кода. Для этого вам нужно изменить шаблон LaTeX, используемый pandoc. Взгляните на этот ответ на вопрос "Как установить размер шрифта для всех стенограмм в презентации Beamer?" должно помочь вам начать.

person A. Donda    schedule 01.01.2014
comment
Неужели нельзя автоматически деформировать слишком длинные строки в блоках кода? - person pimpampoum; 23.05.2014
comment
@pimpampoum Поскольку рендеринг выполняется LaTeX, я думаю, может быть какой-то способ сделать это. Но я подозреваю, что это может потребовать взлома LaTeX, о котором я ничего не знаю. Возможно, вы захотите спросить на tex.SE, знает ли он, как сделать строки разрыва среды verbatim, а затем поместить этот код в шаблон pandoc. - person A. Donda; 23.05.2014
comment
Я использую Pandoc для md -> html, а затем wkhtmltopdf для html -> pdf только потому, что проблем с LaTeX слишком много. Я обнаружил, что Pandoc вставляет <style type="text/css">code{white-space: pre;}</style> в заголовок файла HTML, поэтому переопределение его с помощью CSS не работает. Поскольку для запуска всего этого я использую скрипт, я просто удаляю стиль с помощью команды sed. - person user766353; 11.11.2014
comment
pre, code { white-space: pre-wrap !important; } работал на меня. Но если вы используете .numberLines, после упаковки цифры будут отключены. - person Beni Cherniavsky-Paskin; 24.06.2015
comment
Когда вы говорите обернуть код вручную, вы имеете в виду просто вставку новой строки? Для меня LaTeX форматирует первый элемент следующей строки как зеленый, поэтому он не выглядит завернутым... он выглядит как начало новой строки - person chimeric; 01.09.2016
comment
@user766353 вы можете заменить шаблон HTML для удаления встроенного стиля для тег code. - person Wolf; 04.07.2017

Если у вас есть недавняя установка LaTeX, включающая пакет fvextra, то есть простое решение, недавно предложено jannick0.

Измените параметры заголовка YAML, чтобы включить

\usepackage{fvextra}
\begin{Highlighting}[breaklines,numbers=left]

и скомпилировать с xelatex.

Например,

---
header-includes:
 - \usepackage{fvextra}
 - \DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,commandchars=\\\{\}}
---

~~~~~{.java}
this is a very long long long long long long long long long long long long long line which is broken
~~~~~~

при компиляции с

pandoc input.md --pdf-engine=xelatex -o output.pdf

дает введите здесь описание изображения

Если бы у вас была опция .numberLines, т.е.

---
header-includes:
 - \usepackage{fvextra}
 - \DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,commandchars=\\\{\}}
---


~~~~~{.java .numberLines}
this is a very long long long long long long long long long long long long long line which is broken
~~~~~~

тогда та же команда будет производить

введите описание изображения здесь

person Clément    schedule 29.01.2018
comment
Полезно знать, спасибо :) Сохранились ли исходные номера строк (если они показаны)? - person Wolf; 30.01.2018
comment
спасибо! Я создаю несколько сценариев 2pdf на основе этого. Есть ли способ указать ширину линии перед разрывом строки? Это кажется чрезвычайно консервативным по сравнению с размером страницы. У меня есть размер шрифта, который может обрабатывать 80 символов, но, похоже, он ломается на 60. - person fommil; 26.09.2018
comment
чтобы ответить на мой собственный вопрос, добавьте \usepackage[textwidth=6in]{geometry} - person fommil; 26.09.2018
comment
Спасибо @Clément, вы знаете, как разрешить разрывы строк в любом месте? У меня есть документ с динамической уценкой, который имеет очень длинные строки, которые я также хотел бы обернуть.... - person ajendrex; 17.06.2019
comment
@ajendrex Должен быть способ с опцией breakanywhere для fvextra. Попробуйте добавить breakanywhere после breaklines, то есть замените `-\DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,commandchars=\\\{\}}`на `-\DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,breakanywhere,commandchars= \\\{\}}`, и дайте мне знать, как это происходит. - person Clément; 19.06.2019
comment
@ajendrex Действительно… я не знаю решения вашей проблемы. Я дам вам знать, если узнаю, как это сделать. Вы можете открыть другой вопрос на этом веб-сайте или по адресу github.com/jgm/pandoc. /issues/4302#issuecomment-360669013 - person Clément; 25.06.2019
comment
Есть ли способ сделать это с блоками в стиле R Markdown? Например. ````{оболочка}`? По какой-то причине я не получаю обернутый или цветной вывод, хотя он оформлен как моноширинный кодовый текст. - person Leo; 10.06.2020
comment
@Leo Спросите подробности в другом вопросе и дайте мне знать здесь, и я посмотрю. Основываясь на вашем комментарии, я понятия не имею, чего вы пытаетесь достичь. - person Clément; 10.06.2020
comment
Необходимо добавить дополнительное определение для работы с языками, не имеющими соответствующей подсветки: например, обычный текст (```text): \DefineVerbatimEnvironment{verbatim}{Verbatim}{breaklines,commandchars=\\\{\}}. - person Sergey Vyacheslavovich Brunov; 23.06.2021