Pandoc 中带列的幻灯片

Posted

技术标签:

【中文标题】Pandoc 中带列的幻灯片【英文标题】:Slides with Columns in Pandoc 【发布时间】:2013-02-15 00:48:11 【问题描述】:

我想在 Beamer 幻灯片中并排显示代码和图像。

在 LaTeX 中,我会使用列来执行此操作。我想在列结构中使用降价。

\begincolumns
\column.5\textwidth

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

\column.5\textwidth

![](A_generated_image.pdf)

\endcolumns

不幸的是,Pandoc 不处理 \begincolumns 和 \endcolumns 语句中的降价。有没有解决的办法?

有没有办法在内联 LaTeX 中使用 markdown? 有纯markdown解决方案吗?

【问题讨论】:

您可能对 tex.sx 上的这个最近的问题感兴趣:tex.stackexchange.com/questions/101717/…。 你试过把图放在桌子上吗? 【参考方案1】:

您可以使用 FletcherPenney MultiMarkdown,它可以将 Markdown 处理为 LaTeX/Beamer。与 Pandoc 相比,MultiMarkdown 没有那么多功能。但是,尤其是在使用 LaTeX 时,它的优势在于您可以将 LaTeX 代码直接嵌入到 html cmets 中的 Markdown 中。

您的代码如下所示:

<!-- \begincolumns -->
<!-- \column.5\textwidth -->

        >>> some python code


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

![](A_generated_image.pdf)

<!-- \endcolumns -->

对我来说,这个解决方案很好用。使用好的编辑器(例如 Scrivener、Sublime Text),您可以编写没有所有 cmets 的乳胶代码,并在编辑后查找/替换它们。此外,Multimarkdown 中的元数据支持更加灵活,因此更容易自定义演示文稿。

同时,我希望 Pandoc 团队提供解决此问题的方法。我认为有些用户希望在他们的 Markdown 文档中嵌入小的 LaTex 代码颗粒,而不需要对其进行转换/转义。

【讨论】:

【参考方案2】:

当您附上 Pandoc 命令时,您可以将 MultiMarkDown cmets ( "" ) 与 Pandoc 一起使用,在该命令中,您可以使用两个 sed 命令将 Markdown 转换为 LaTeX。

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

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 的所有好东西。您只需对那些被转义或包含 Markdown 较大部分的 TeX 和 LaTeX 命令进行 mmd 注释。

【讨论】:

【参考方案3】:

我希望还是有价值的。我在 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]

过滤器会将每个标记转换为 \begincolumns 和 \column.5\textwidth,因此,上面的文档将转入

\beginframe[fragile]Hello

\begincolumns

\column0.5\textwidth

\beginShaded
\beginHighlighting[]
    \NormalToksome python code
\endHighlighting
\endShaded

\column0.5\textwidth

Hello World

\endcolumns

\endframe

代码过滤器在这里

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'\begincolumns')
            elif content == "/columns":
                return latex(r'\endcolumns')
            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

尽情享受吧!

【讨论】:

最好把它放在用户可以报告问题的要点(或类似的地方)。【参考方案4】:

问题是pandoc 如果找到\begin 会忽略markdown。另一种方法是编辑投影仪模板并添加以下内容:

\newcommand\columnsbegin\begincolumns
\newcommand\columnsend\endcolumns

然后这样写:

\columnsbegin
\column.5\textwidth

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

\column.5\textwidth

![](A_generated_image.pdf)

\columnsend

【讨论】:

【参考方案5】:

当前版本的 pandoc(即 pandoc 2.0 及更高版本)支持fenced divs。定位幻灯片格式时,特殊命名的 div 会转换为列:

# This slide has columns

::: columns

:::: column
left
::::

:::: column
right
::::

:::

Pandoc 将其翻译成以下 LaTeX 投影仪代码:

\beginframeThis slide has columns
\protect\hypertargetthis-slide-has-columns

\begincolumns[T]
\begincolumn0.48\textwidth
left
\endcolumn

\begincolumn0.48\textwidth
right
\endcolumn
\endcolumns

\endframe

这很简单,并且具有在针对其他演示格式(如reveal.js)时提供类似结果的额外优势。

对于 Beamer 输出,开箱即用的列不止两列。然而,Powerpoint 只支持两列。对于reveal.js,必须明确给出三列或更多列的宽度:

::: columns

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

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

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

:::

【讨论】:

有没有办法指定列的垂直对齐方式?充其量,分别为他们每个人? 另见我的related question 请注意,要使其正常工作,您需要显式启用扩展,例如通过--from markdown+fenced_divs @luator 是和否。 fenced_divs 扩展在 pandoc 的 Markdown 中默认启用,因此这不是必需的。但是,当谈到 CommonMark 及其变体 GitHub Flavored Markdown 时,您是正确的。在这些情况下,必须手动启用扩展:--from=gfm+fenced_divs @tarleb 实际上,它正在使用默认设置。我之前遇到了一些问题,并认为设置--from 修复了它,但显然我把事情搞糊涂了。感谢您澄清这一点!【参考方案6】:

Beamer 特定答案。我在尝试在常规文档中为 Pandoc 添加多个列时遇到了一个解决方案。它也可以在这里工作,尽管它确实将您限制在 Beamer 上;虽然这是你的用例。

在幻灯片中,插入一次:

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

然后添加内容:

\Begincolumns
\Begincolumn0.3\textwidth

Res ipsum loquiter, sed in inferno decit?

\Endcolumn

\Begincolumn0.3\textwidth

Res ipsum loquiter, sed in inferno decit?

\Endcolumn
\Begincolumn0.3\textwidth

Res ipsum loquiter, sed in inferno decit?

\Endcolumn
\Endcolumns

创建“hideFromPandoc”命令可让您在整个过程中插入开始/结束语句,而不会剥夺您在块中的降价。

Fenced 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。

【讨论】:

以上是关于Pandoc 中带列的幻灯片的主要内容,如果未能解决你的问题,请参考以下文章

使用 knitr、Rmarkdown 和 pandoc 创建 HTML 幻灯片

android studio中带有setImageDrawable方法的NullPointerException [重复]

Bootstrap 3.0 中带有缩略图的轮播

如何使用 knitr 为降价设置本地图像的大小?

DataFrame新增列的方法

从引导网格列到轮播