Слайды с колоннами в Pandoc - программирование
Подтвердить что ты не робот

Слайды с колоннами в Pandoc

Я хотел бы иметь код и изображение бок о бок в слайде Beamer.

В LaTeX я бы сделал это с помощью столбцов. Я хотел бы использовать markdown в структуре столбца.

\begin{columns}
\column{.5\textwidth}

~~~~~~~~Python
>>> some python code
~~~~~~~

\column{.5\textwidth}

![](A_generated_image.pdf)

\end{columns}

К сожалению, Pandoc не обрабатывает уценку в операторах \begin {columns} и \end {columns}. Есть ли способ обойти это?

  • Есть ли способ использовать уценку внутри встроенного LaTeX?
  • Есть ли чистое решение по уценке?
4b9b3361

Ответ 1

Проблема заключается в том, что pandoc игнорирует уценку, если находит \begin{}. Альтернативой является редактирование шаблона диаграммы лучей и добавление следующего:

\newcommand{\columnsbegin}{\begin{columns}}
\newcommand{\columnsend}{\end{columns}}

И напишите его вот так:

\columnsbegin
\column{.5\textwidth}

~~~~~~~~Python
>>> some python code
~~~~~~~

\column{.5\textwidth}

![](A_generated_image.pdf)

\columnsend

Ответ 2

Надеюсь, все еще ценно. Я сделал фильтр Pandoc в Python, чтобы легко разместить столбцы, чтобы вы могли писать свои презентации таким образом:

# Hello World

[columns]

[column=0.5]

~~~python
    if __name__ == "__main__":
        print "Hello World"
~~~

[column=0.5]

This is how a "Hello World" looks like in Python

[/columns]

чтобы фильтр конвертировал каждую разметку в \begin {columns} и \column {.5\textwidth}, поэтому в приведенном выше документе появится

\begin{frame}[fragile]{Hello}

\begin{columns}

\column{0.5\textwidth}

\begin{Shaded}
\begin{Highlighting}[]
    \NormalTok{some python code}
\end{Highlighting}
\end{Shaded}

\column{0.5\textwidth}

Hello World

\end{columns}

\end{frame}

Фильтр кода здесь

import pandocfilters as pf

def latex(s):
    return pf.RawBlock('latex', s)

def mk_columns(k, v, f, m):
    if k == "Para":
        value = pf.stringify(v)
        if value.startswith('[') and value.endswith(']'):
            content = value[1:-1]
            if content == "columns":
                return latex(r'\begin{columns}')
            elif content == "/columns":
                return latex(r'\end{columns}')
            elif content.startswith("column="):
                return latex(r'\column{%s\textwidth}' % content[7:])

if __name__ == "__main__":
    pf.toJSONFilter(mk_columns)

Если вы никогда не используете фильтр pandoc, просто сохраните фильтр в том же месте документа, что и columnfilter.py (или другое имя, которое вы хотите) и запустите

pandoc -t beamer --filter columnfilter.py yourDocument.mkd

И наслаждайтесь!

Ответ 3

Вы можете использовать FletcherPenney MultiMarkdown, который может обрабатывать уценку до LaTeX/Beamer. По сравнению с Pandoc, MultiMarkdown имеет не так много функций. Однако, особенно при работе с LaTeX, у него есть то преимущество, что вы можете вставлять код LaTeX непосредственно в комментарии Markdown в комментариях HTML.

Ваш код будет выглядеть так:

<!-- \begin{columns} -->
<!-- \column{.5\textwidth} -->

        >>> some python code


<!-- \column{.5\textwidth} -->

![](A_generated_image.pdf)

<!-- \end{columns} -->

Для меня это решение отлично работает. С хорошим редактором (например, Scrivener, Sublime Text) вы можете написать латексный код без комментариев и найти/заменить их после редактирования. Кроме того, поддержка Metadata в Multimarkdown намного более гибкая, так что легче создавать презентации.

Тем временем я надеюсь, что команда Pandoc обеспечит решение этой проблемы. Я думаю, что есть некоторые пользователи, которые хотели бы вставлять небольшие части кода LaTex во все документы по уценке без их преобразования/экранирования.

Ответ 4

Вы можете использовать комментарии MultiMarkDown ( "<! - Ваш код LaTeX внутри → " ) с помощью Pandoc, когда вы заключаете команду Pandoc, в которой вы преобразовываете уценку в LaTeX с помощью двух команд sed.

В первом опыте sed вы меняете комментарии MultiMarkDown на "\ verb + AAAAAAALaTeX-StuffZZZZZZ +". Затем вы превращаетесь в LaTeX с Pandoc, как обычно, все внутри "\ verb + AAAAAAALaTeX-StuffZZZZZZZ +" остается в покое. Затем вы запускаете sed в TeX файле и удаляете "\ verb + AAAAAAA" и "ZZZZZZ +", разворачивая ваш код LaTeX.

Первая командная строка sed перед преобразованием Pandoc может выглядеть так:

 sed -E -e "s/<\\!--(.+)--\\>/\\\\verb\+AAAAAAA\1ZZZZZZZ\+/g " \
     source.md > source.i.md

Затем используйте Pandoc на source.i.md, как обычно, для создания source.tex. Второй sed работает следующим образом:

 sed -E -e "s/\\\\verb\+AAAAAAA(.+)ZZZZZZZ\+/\1/g" -i "" source.tex

Я автоматизировал все в Makefile, чтобы я мог делать больше изменений, например. для определения таблиц за один шаг. На первый взгляд этот подход работает отлично (проверял его на определения столбцов с классом лучей).

С помощью этих небольших скриптов sed вы можете использовать все приятные вещи из Pandoc. Вам нужно только mmd-комментировать те команды TeX и LaTeX, которые либо экранируются, либо закрывают большие части вашего Markdown.