在 LaTeX 中将 Markdown 转换为 LaTeX

在 LaTeX 中将 Markdown 转换为 LaTeX

我开始使用 markdown 做笔记只是因为它比写 latex 更快,但我更希望拥有比 LaTeX 更强大的功能。是否有/是否有可能有一个markdown将 markdown 转换为 latex 的环境?LaTeX 是否足够强大以解析另一种语言?

附带问题:LaTeX 图灵完备吗?

我猜一个选项是将数据传递给我编写的脚本来转换它们。我读过这是可行的,是否可以将 latex 管道数据放入另一个程序的标准输入中?

答案1

对于 latex 来说,合适的 markdown 解析器是一项过于复杂的任务。这并不是因为 TeX 不是图灵完备语言(它是),而是因为它很难实现,而且性能可能很差。

我立即想到的一个想法是使用 LuaTeX,并用 Lua 语言编写 markdown 解析器。这听起来当然可行。

根据维基百科,用Lua实现的Markdown解析器只有三个:

  • markdown.lua。它很简单,而且可能很容易集成到 LuaLatex 包中,但目前它只输出 HTML,因此应该完全重写输出部分以生成 latex 代码。

  • 卢纳马克。这个非常完整。它可以输出多种格式,包括 LaTeX,并支持许多非标准额外模块。但是,它依赖于其他 Lua 包,因此为了将其与 LuaTex 集成,它应该被剥离(例如,可以删除模板支持,因为模板将是使用它的文档,以及除 LaTeX 之外的所有输出格式)。

  • lua-折扣这是用 C 编写的解析器的 lua 绑定,因此可以将其丢弃,因为它无法嵌入到 LuaTeX 中。

因此,Lua 方法基本上可以归结为以下两种方法之一:

  1. 修改 markdown.lua 使其输出 LaTeX
  2. 剥离 lunamark 以删除所有不必要的东西。

我不确定哪一个会更容易。可能 1 会在较短的时间内产生一些有用的东西,但 2 看起来是一个更好的长期解决方案。

此外,还应定义 LaTeX 和 Lua 之间的接口。明智的做法是:

% Latex stuff....
\begin{markdown}
# First section
etc..
\end{markdown}

但是我对 LuaTeX 世界还很陌生,而且(目前)我不知道如何将环境内的所有文本传递给 Lua 函数markdown。我们还应该阻止 TeX 标记所有文本。

一个可能的想法是使用一些逐字逐句的技巧将环境的内容写入文件,然后使用 lua 处理该文件并将生成的 tex 插回到主文档中(可以这样tex.sprint()做,不是吗?)

我想听听这里的LuaTeX专家的意见......

附言:这算答案吗?还是我应该删除它并重新发布为问题?

答案2

我不确定为什么这个页面上基于 Pandoc 的解决方案/答案会获得如此多的赞成票,尽管它过于复杂。

如果你使用 Pandoc,方法就更简单了:

  1. 只写 Markdown。
  2. 当您想要在最终文档中应用 LaTeX 功能时,只需将 Markdown 与 LaTeX 片段混合使用即可……

这是一个可行的(不是那么简单)示例,其中的主要内容是用 Markdown 编写的,偶尔会在其间穿插一些 LaTeX 代码:

% Proof of Existing Pandoc Feature
% Kurt Pfeifle
% May 25th, 2015

# Basics

This is not just a *proof of concept*, but a basic utilization of [Pandoc][2]'s behavior
when it comes to [Markdown][1] processing.

* Pandoc, by default, passes any \LaTeX\ code snippets it identifies within the Markdown
  source file to the target document, if that target document is a \LaTeX\ one (this
  includes f.e. Beamer or PDF output.
  (It does not pass these snippets to any other output formats, but instead drops them.)
* Pandoc, by default, also passes any HTML code snippets it identifies within the
  Markdown sources to the target document, should that be HTML based (this includes f.e.
  EPUB or RevealJS output).
  (It does not pass these snippets to any other output formats, but instead drops them.)
* This allows for any specific formatting to be achieved in the target document format:
  ***(1)*** Insert two versions of the snippet, one as HTML, one as \LaTeX\. ***(2)***
  The HTML one will make it to the HTML-based targets, while \LaTeX\ is being dropped;
  the \LaTeX\ will make it into \LaTeX-based targets, while the HTML is being dropped.

It also supports linked references. **[Click here](#tab:fsttable)** to jump to a page with a
table.


## How it works

It works out of the box:

1. Just write a Markdown document, and sprinkle your \LaTeX\ code snippets in between.
1. Save the document with an `.md` suffix.
1. Run the Pandoc conversion:

    ```` {.bash}
     pandoc --from=markdown --output=my.tex my.md --to=latex --standalone
    ````

    or

    ```` {.bash}
     pandoc --from=markdown --output=my.pdf my.md                                   \
            --variable=geometry:"margin=0.5cm, paperheight=421pt, paperwidth=595pt" \
            --highlight-style=espresso
    ````

I want a few words appear as \textcolor{red}{red} or in a \textcolor{green}{different}
\textcolor{blue}{color}. Here is the Markdown source code of previous sentence; it uses
no syntax highlighting (unlike the previous two code blocks):

     [...] as \textcolor{red}{red} or in a \textcolor{green}{different}
     \textcolor{blue}{color}.

After this paragraph, I want to insert a page break. I'll add `\newpage{}` beneath, on
a line of its own.

\newpage{}

This was the Markdown source code (with context) for the page break preceeding this:

```` {.markdown}
After this paragraph, I want to insert a page break. I'll add `\newpage{}` beneath, on
a line of its own.

\newpage{}
````

## Inserting a \LaTeX\ table

Here comes a table. Its code is inserted as \LaTeX\ code into the Markdown source document:

\begin{table}[h]
\centering
\begin{tabular}{|r|l|}
  \hline
  7C0 & hexadecimal \\
  3700 & octal \\ \cline{2-2}
  11111000000 & binary \\
  \hline \hline
  1984 & decimal \\
  \hline
\end{tabular}
\caption\small\textit{\textcolor{magenta}{This table shows some data}}
\label{tab:fsttable}
\end{table}

This is the Markdown code for the previous table, including its textual context:

```` {.latex}
Here comes a table. Its code is inserted as \LaTeX\ code into the Markdown source document:

\begin{table}[h]
\centering
\begin{tabular}{|r|l|}
  \hline
  7C0 & hexadecimal \\
  3700 & octal \\ \cline{2-2}
  11111000000 & binary \\
  \hline \hline
  1984 & decimal \\
  \hline
\end{tabular}
\caption\small\textit{\textcolor{magenta}{This table shows some data}}
\label{tab:fsttable}
\end{table}

This is the Markdown code for the previous table, including its textual context:
````

## Inserting a \LaTeX\ Formula

To include a mathematical formula in Markdown, enclose it with **`$`** characters like this:

```` {.latex}
 $\frac{n!}{k!(n-k)!} = \binom{n}{k}$
````

The result:

$\frac{n!}{k!(n-k)!} = \binom{n}{k}$

# Status

There are no known (to me) bugs for this feature.

[1]: http://daringfireball.net/projects/markdown/
[2]: http://pandoc.org/

使用以下命令将其转换为 PDF:

pandoc --from=markdown --output=my.pdf my.md                                   \
       --variable=geometry:"margin=0.5cm, paperheight=421pt, paperwidth=595pt" \
       --highlight-style=espresso

结果:

我的.pdf 截图

答案3

这是基于 Pandoc 的解决方案。您必须启用--shell-escape它才能工作,因为它使用了\write18。根据您的需要,您可能需要自定义 Pandoc 选项。

\documentclass{article}

\usepackage{fancyvrb}

\newenvironment{markdown}%
    {\VerbatimEnvironment\begin{VerbatimOut}{tmp.markdown}}%
    {\end{VerbatimOut}%
        \immediate\write18{pandoc tmp.markdown -t latex -o tmp.tex}%
        \input{tmp.tex}}

\begin{document}

\begin{markdown}
# Section

Some text that goes on for a while.

A list:

* Item
* Another item 

\end{markdown}

\end{document}

答案4

这个问题很老了,但为了将来参考,现在有一个包markdown

\documentclass{article}
\usepackage[fencedCode]{markdown}

\begin{document}
\begin{markdown}
# Header
## My First Steps
Let's have a tiny list:

-   test
-   test2
    -  `\verbatim`

```
foo.bar(do=True)
```
\end{markdown}
\end{document}

给定示例的输出显示了由 Latex 渲染的 Markdown

有许多选项可以修改 markdown 解析的复杂性,例如,\usepackage[hashEnumerators, definitionLists, footnotes, inlineFootnotes, smartEllipses, fencedCode, contentBlocks, pipeTables, tableCaptions]{markdown}它还提供\markdownInput{yourfile.md}将外部.md文件包含到您的文档中。

相关内容