32

我想在 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 中使用降价?
  • 有纯粹的降价解决方案吗?
4

6 回答 6

30

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

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

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

::: columns

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

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

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

:::
于 2018-09-02T18:48:22.493 回答
21

问题是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
于 2014-09-26T23:35:37.380 回答
21

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

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

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

pandoc -t beamer --filter columnfilter.py yourDocument.mkd

享受!

于 2014-06-04T14:23:56.457 回答
5

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 一起使用:

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

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

于 2019-03-17T12:57:20.127 回答
2

当您附上 Pandoc 命令时,您可以在 Pandoc 中使用 MultiMarkDown 注释(“<!-- Your LaTeX Code inside -->”),在该命令中,您使用两个 sed 命令将 Markdown 转换为 LaTeX。

在第一次 sed 运行中,您将 MultiMarkDown 注释更改为“\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 中的所有好东西。您只需要 mmd 注释那些被转义或包含 Markdown 较大部分的 TeX 和 LaTeX 命令。

于 2013-05-03T19:32:53.830 回答
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 代码颗粒,而不需要对其进行转换/转义。

于 2013-04-24T15:00:59.257 回答