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 [重复]