Pandoc中带有列的幻灯片

MRo*_*lin 24 markdown latex beamer pandoc

我希望在Beamer幻灯片中并排显示代码和图像.

在LaTeX中,我会用列做到这一点.我想在列结构中使用markdown.

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

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

\column{.5\textwidth}

![](A_generated_image.pdf)

\end{columns}
Run Code Online (Sandbox Code Playgroud)

不幸的是,Pandoc不处理\ begin {columns}和\ end {columns}语句中的markdown.有没有解决的办法?

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

小智 20

我希望还有价值.我用Python 制作了一个Pandoc过滤器,可以轻松放置列,因此您可以用这种方式编写演示文稿:

# 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]
Run Code Online (Sandbox Code Playgroud)

过滤器会将每个标记转换为\ 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}
Run Code Online (Sandbox Code Playgroud)

代码过滤器在这里

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)
Run Code Online (Sandbox Code Playgroud)

如果您从不使用pandoc过滤器,只需将过滤器保存到与columnfilter.py您想要的(或其他名称)相同的文档位置并运行

pandoc -t beamer --filter columnfilter.py yourDocument.mkd
Run Code Online (Sandbox Code Playgroud)

享受!


ivo*_*ron 20

问题是,pandoc如果找到了,则忽略降价\begin{}.另一种方法是编辑beamer模板并添加以下内容:

\newcommand{\columnsbegin}{\begin{columns}}
\newcommand{\columnsend}{\end{columns}}
Run Code Online (Sandbox Code Playgroud)

并写这样:

\columnsbegin
\column{.5\textwidth}

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

\column{.5\textwidth}

![](A_generated_image.pdf)

\columnsend
Run Code Online (Sandbox Code Playgroud)


tar*_*leb 10

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

# This slide has columns

::: columns

:::: column
left
::::

:::: column
right
::::

:::
Run Code Online (Sandbox Code Playgroud)

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}
Run Code Online (Sandbox Code Playgroud)

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


Mer*_*vex 5

Beamer 特定答案。尝试在常规文档中为 Pandoc 添加多列时,我遇到了一个解决方案。它也适用于这里,尽管它确实限制了您使用 Beamer;尽管这是您的用例。

在幻灯片中,插入一次:

---
header-includes:
- \newcommand{\hideFromPandoc}[1]{#1}
- \hideFromPandoc{
    \let\Begin\begin
    \let\End\end
  }
---
Run Code Online (Sandbox Code Playgroud)

然后添加内容:

\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}
Run Code Online (Sandbox Code Playgroud)

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

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

::: {.columns}
:::: {.column width=0.3}
Test
::::
:::: {.column width=0.3}
Test
::::
:::: {.column width=0.3}
Test
::::
:::
Run Code Online (Sandbox Code Playgroud)

为了得到这个答案,我不得不查看专门添加了列功能的提交


Mar*_*tin 2

您可以使用 FletcherPenney MultiMarkdown,它可以将 Markdown 处理为 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} -->
Run Code Online (Sandbox Code Playgroud)

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

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