Pandoc中带有列的幻灯片

时间:2013-02-28 17:43:07

标签: latex markdown beamer 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}语句中的markdown。有没有解决的办法?

  • 有没有办法在内联的LaTeX中使用markdown?
  • 是否有纯粹的降价解决方案?

6 个答案:

答案 0 :(得分:20)

问题是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

答案 1 :(得分:19)

我希望仍然有价值。我在Python中创建了一个Pandoc filter来轻松放置列,因此您可以用这种方式编写演示文稿:

# 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]

过滤器会将每个标记转换为\ _开始{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

享受!

答案 2 :(得分:7)

当前的pandoc版本(即pandoc 2.0及更高版本)支持fenced divs。以幻灯片格式为目标时,将特别命名的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}

这很简单,并且具有额外的优势,即在针对其他表现形式(如reveal.js)时也可以提供相似的结果。

答案 3 :(得分:2)

你可以使用FletcherPenney MultiMarkdown来处理对LaTeX / Beamer的降价。与Pandoc相比,MultiMarkdown没有那么多功能。但是,特别是在使用LaTeX时,它的优势在于您可以将LaTeX代码直接嵌入到HTML注释中的Markdown中。

您的代码如下所示:

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

        >>> some python code


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

![](A_generated_image.pdf)

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

对我来说这个解决方案运行正常。使用一个好的编辑器(例如Scrivener,Sublime Text),你可以在没有所有注释的情况下编写乳胶代码,并在编辑后查找/替换它们。此外,Multimarkdown中的元数据支持更加灵活,因此可以更轻松地自定义演示文稿。

与此同时,我希望Pandoc团队能够解决这个问题。我认为有些用户希望在整个降价文档中嵌入小型LaTex代码粒子而不进行转换/转义。

答案 4 :(得分:2)

使用Pandoc时,可以使用Pandoc使用MultiMarkDown注释(“&lt;! - 您的LaTeX代码 - &gt;”),并使用两个sed命令将您的markdown转换为LaTeX。

在第一个sed运行中,您将MultiMarkDown注释更改为“\ verb + AAAAAAALaTeX-StuffZZZZZZ +”。然后像往常一样使用Pandoc转换为LaTeX,“\ verb + AAAAAAALaTeX-StuffZZZZZZZ +”中的所有内容都保持不变。然后在TeX文件上运行sed并删除“\ verb + AAAAAAA”和“ZZZZZZ +”展开您的LaTeX代码。

Pandoc转换之前的第一个sed命令行可能如下所示:

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

然后像往常一样在source.i.md上使用Pandoc来创建source.tex。第二个sed运行如下:

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

我自动化Makefile中的所有内容,以便我可以进行更多更改,例如一步完成表定义。乍一看,这种方法工作正常(使用beamer类对列定义进行测试)。

使用这个小的sed脚本,你可以使用Pandoc的所有好东西。你只需要对那些被转义的TeX和LaTeX命令进行mmd-comment,或者将你Markdown的较大部分包含在内。

答案 5 :(得分:1)

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”命令,您可以在整个代码段中插入begin / end语句,而不会在块中失去markdown的功能。

围栏Div答案。上面有一个涉及围栏div的答案。我评论说,答案仅适用于两列。它分解更多。以下是该答案适用于多个div的方式:

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

要获得此答案,我必须查看the commit that added the column feature specifically