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

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

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

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

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

\column{.5\textwidth}

![](A_generated_image.pdf)

\end{columns}

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

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

5 ответов

Текущие версии pandoc (т.е. pandoc 2.0 и более поздние) поддерживают ограждение div. Специально названные div преобразуются в столбцы при таргетинге на формат слайдов:

# This slide has columns

::: columns

:::: column
left
::::

:::: column
right
::::

:::

Pandoc переводит это в следующий код LaTeX beamer:

\begin{frame}{This slide has columns}
\protect\hypertarget{this-slide-has-columns}{}

\begin{columns}[T]
\begin{column}{0.48\textwidth}
left
\end{column}

\begin{column}{0.48\textwidth}
right
\end{column}
\end{columns}

\end{frame}

Это просто и имеет дополнительное преимущество, заключающееся в том, что он дает схожие результаты при нацеливании на другие форматы представления, такие каккартику в формате JPEG

Я надеюсь, что все еще ценный Я сделал фильтр 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

И наслаждаться!

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

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

И напишите это так:

\columnsbegin
\column{.5\textwidth}

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

\column{.5\textwidth}

![](A_generated_image.pdf)

\columnsend

Конкретный ответ Beamer. Я наткнулся на решение при попытке добавить несколько столбцов для Pandoc в обычный документ. Это работает и здесь, хотя ограничивает вас Beamer; хотя это ваш вариант использования.

В слайде вставьте один раз:

---
header-includes:
- \newcommand{\hideFromPandoc}[1]{#1}
- \hideFromPandoc{
    \let\Begin\begin
    \let\End\end
  }
---

Затем добавьте контент таким образом:

\Begin{columns}
\Begin{column}{0.3\textwidth}

Res ipsum loquiter, sed in inferno decit?

\End{column}

\Begin{column}{0.3\textwidth}

Res ipsum loquiter, sed in inferno decit?

\End{column}
\Begin{column}{0.3\textwidth}

Res ipsum loquiter, sed in inferno decit?

\End{column}
\End{columns}

Создание команды "hideFromPandoc" позволяет вставлять операторы начала / конца без лишних уценок в блоке.

Огороженный Div Ответ. Там выше ответ, который относится к огороженным div. Я прокомментировал, что ответ работает только с двумя столбцами. Это ломается с большим количеством. Вот как этот ответ работает с несколькими элементами div:

::: {.columns}
:::: {.column width=0.3}
Test
::::
:::: {.column width=0.3}
Test
::::
:::: {.column width=0.3}
Test
::::
:::

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

Вы можете использовать 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) вы можете написать латексный код без всех комментариев и найти / заменить их после редактирования. Кроме того, поддержка метаданных в Multimarkdown гораздо более гибкая, что упрощает настройку презентаций.

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

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

При первом запуске sed вы изменяете комментарии MultiMarkDown на "\verb+AAAAAAALaTeX-StuffZZZZZZ+". Затем вы преобразуетесь в LaTeX с помощью Pandoc, как обычно, все, что находится внутри "\verb+AAAAAAALaTeX-StuffZZZZZZZ+", остается одним. Затем вы запускаете sed для TeX-File и удаляете "\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 -E -e "s/\\\\verb\+AAAAAAA(.+)ZZZZZZZ\+/\1/g" -i "" source.tex

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

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

Другие вопросы по тегам