Слайды со столбцами в Pandoc

Я хотел бы, чтобы код и изображение располагались рядом на слайде 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?
  • Есть ли чистая уценка?

person MRocklin    schedule 28.02.2013    source источник
comment
Возможно, вас заинтересует этот недавний вопрос о tex.sx: tex.stackexchange.com/questions/101717/.   -  person G. Poore    schedule 11.03.2013
comment
Вы пробовали складывать цифру в таблицу?   -  person Jakob    schedule 22.05.2013


Ответы (6)


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

# This slide has columns

::: columns

:::: column
left
::::

:::: column
right
::::

:::

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

\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}

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

Для вывода Beamer из коробки работает более двух столбцов. Powerpoint, однако, поддерживает только два столбца. Для раскрытия.js ширина трех или более столбцов должна быть указана явно:

::: columns

:::: {.column width=30%}
left
::::

:::: {.column width=30%}
middle
::::

:::: {.column width=30%}
right
::::

:::
person tarleb    schedule 02.09.2018
comment
Есть ли способ указать вертикальное выравнивание столбцов? В лучшем случае отдельно для каждого из них? - person mavericks; 20.02.2021
comment
См. Также мой связанный с этим вопрос - person mavericks; 22.02.2021

Проблема в том, что 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
person ivotron    schedule 26.09.2014

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

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

person Wagner Macedo    schedule 04.06.2014
comment
Было бы неплохо поместить его в суть (или подобное место), где пользователь может сообщить о проблеме. - person Dilawar; 03.09.2017

Конкретный ответ 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:

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

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

person Merovex    schedule 17.03.2019

Вы можете использовать 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 в свои документы уценки без их преобразования / экранирования.

person Martin    schedule 24.04.2013

Вы можете использовать комментарии 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, чтобы я мог вносить больше изменений, например. к определениям таблиц за один шаг. На первый взгляд этот подход работает нормально (тестировал его на определениях столбцов с помощью класса beamer).

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

person Martin    schedule 03.05.2013