MRo*_*lin 24 markdown latex beamer pandoc
我希望在Beamer幻灯片中并排显示代码和图像.
在LaTeX中,我会用列做到这一点.我想在列结构中使用markdown.
\begin{columns}
\column{.5\textwidth}
~~~~~~~~Python
>>> some python code
~~~~~~~
\column{.5\textwidth}

\end{columns}
Run Code Online (Sandbox Code Playgroud)
不幸的是,Pandoc不处理\ begin {columns}和\ end {columns}语句中的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}

\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)时具有提供类似结果的额外优势.
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)
为了得到这个答案,我不得不查看专门添加了列功能的提交。
您可以使用 FletcherPenney MultiMarkdown,它可以将 Markdown 处理为 LaTeX/Beamer。与 Pandoc 相比,MultiMarkdown 没有那么多功能。然而,特别是在使用 LaTeX 时,它的优点是您可以将 LaTeX 代码直接嵌入到 HTML 注释中的 Markdown 中。
你的代码看起来像这样:
<!-- \begin{columns} -->
<!-- \column{.5\textwidth} -->
>>> some python code
<!-- \column{.5\textwidth} -->

<!-- \end{columns} -->
Run Code Online (Sandbox Code Playgroud)
对我来说这个解决方案效果很好。使用好的编辑器(例如 Scrivener、Sublime Text),您可以编写没有所有注释的乳胶代码,并在编辑后查找/替换它们。此外,Multimarkdown 中的元数据支持更加灵活,因此更容易定制演示文稿。
同时,希望Pandoc团队能够针对这个问题提供一个解决方案。我认为有些用户希望在他们的 Markdown 文档中嵌入小的 LaTex 代码粒子,而不需要对其进行转换/转义。
归档时间: |
|
查看次数: |
8076 次 |
最近记录: |