203

我一直在使用 Markdown 做课堂笔记,非常棒。我什至对 Markdown 做了一些预处理,这样我就可以做表格之类的事情了。但是这个学期我正在教一门数学课,我希望能够将 LaTeX 公式与 Markdown 结合起来,如下所示:

The refinement relation is written $a \sqsubseteq b$, which can be 
pronounced "$a$ approximates $b$" or "$b$ is at least as defined as $a$".

我希望能够获取 LaTeX 的每个片段并将其预处理为一个很好的抗锯齿 PNG 文件,然后我可以通过 HTML<img>标记将其包含在我的 Markdown 中。但我完全不知道如何获取 LaTeX 的片段并获得一个漂亮的图像

  • 有正确的边界框
  • 是否抗锯齿

我所知道的只是获取 DVI、PostScript 或 PDF 格式的完整页面。

我确信这个问题已经得到解决,但我无法猜出正确的搜索词。任何建议如何解决它或在哪里寻找现有的解决方案?


编辑:安装 mathTeX 后,我可以说代码不灵活,它违反了 Linux 文件系统层次结构标准,而且它是业余工作——无论从这个词的好坏意义上来说。代码非常复杂,没有明显的错误。我会寻找替代品。

此外,很明显,在底部,解决方案是基于dvipng.


一年后:我从来没有得到我一直希望的无缝集成,但我在自己设计的脚本上蹒跚前行。事实证明,取而代之的dvipng是更容易使用dvips -EconvertImageMagick 程序。好处是可以更好地控制缩放等内容,并且可以轻松制作透明背景。好奇的可以看看这个例子

我不能向任何人推荐这个解决方案。但我也不推荐 MathTeX。

4

15 回答 15

84

你试过Pandoc吗?

编辑:

尽管文档变得有点复杂,pandoc已经支持内联 LaTeXLaTeX 模板10 年了。

像下面这样的文档可以用Markdown编写:

---
title: Just say hello!
author: My Friend
header-includes: |
    \usepackage{tikz,pgfplots}
    \usepackage{fancyhdr}
    \pagestyle{fancy}
    \fancyhead[CO,CE]{This is fancy}
    \fancyfoot[CO,CE]{So is this}
    \fancyfoot[LE,RO]{\thepage}
abstract: This is a pandoc test with Markdown + inline LaTeX
---

Just say hello!
===============

This could be a good example or inlined \LaTeX:

\begin{tikzpicture}
\begin{axis}
\addplot[color=red]{exp(x)};
\end{axis}
\end{tikzpicture}
%Here ends the furst plot
\hskip 5pt
%Here begins the 3d plot
\begin{tikzpicture}
\begin{axis}
\addplot3[
    surf,
]
{exp(-x^2-y^2)*x};
\end{axis}
\end{tikzpicture}

And now, just a few words to terminate:

> Goodbye folks!

可以使用以下命令将其转换为 LaTeX:pandoc -s -i Hello.md -o Hello.tex

以下是使用MiKTeX作为 LaTeX 处理器使用命令转换Hello.mdHello.pdf文件的图像:pandoc -s -i Hello.md -o Hello.pdf

在此处输入图像描述

最后,还有一些像这样的开源LaTeX 模板: https://github.com/Wandmalfarbe/pandoc-latex-template,可用于更好的格式化。

与往常一样,如果读者的用例比这里介绍的少,那么他应该深入挖掘。

于 2010-03-31T12:08:20.407 回答
44

也许mathJAX是门票。它基于jsMath构建,这是一个 2004 年的老式 JavaScript 库。

从 2015 年 2 月 5 日起,我会转而推荐KaTeX——来自可汗学院的性能最高的 Javascript LaTeX 库。

于 2010-02-03T00:42:16.490 回答
31

将以下代码添加到 Markdown 文件的顶部以获得 MathJax 渲染支持

<style TYPE="text/css">
code.has-jax {font: inherit; font-size: 100%; background: inherit; border: inherit;}
</style>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
    tex2jax: {
        inlineMath: [['$','$'], ['\\(','\\)']],
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre'] // removed 'code' entry
    }
});
MathJax.Hub.Queue(function() {
    var all = MathJax.Hub.getAllJax(), i;
    for(i = 0; i < all.length; i += 1) {
        all[i].SourceElement().parentNode.className += ' has-jax';
    }
});
</script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js?config=TeX-AMS_HTML-full"></script>

然后 `$x^2$` 或 `$$x^2$$` 将按预期呈现:-)

如果您不想使用在线发行版,您始终可以安装本地版本的 MathJax,但您可能需要通过本地网络服务器托管它。

更新:这些天我只使用pandoc而不是规范降价,但上面仍然有用。

于 2012-10-19T17:14:35.553 回答
12

我会用反问来回答你的问题......

您如何看待 Org 模式?它不像 Markdown 那样纯粹,但它类似于 Markdown,而且我发现它很容易使用,并且它允许嵌入 Latex。参照。http://www.gnu.org/software/emacs/manual/html_node/org/Embedded-LaTeX.html

后记

如果您还没有看过 org-mode,它作为通用的“自然标记语言”比 Markdown 具有很大的优势,即它对表格的处理。来源:

| 1 | 0 | 0 |
| -1 | 1 | 0 |
| -1 | -1 | 1 |

代表你认为它会...

Latex 是使用 tex-mode 的 preview-latex 渲染的。

于 2010-02-03T11:48:51.590 回答
8

你应该看看 multimarkdown http://fletcherpenney.net/multimarkdown/

它支持元数据(标题、关键字、日期、作者等)、表格、asciimath、mathml,我相信你可以把乳胶数学代码贴在那里。它基本上是 Markdown 的扩展,以添加所有其他非常有用的功能。它使用 XSLT,因此您可以轻松创建自己的 LaTeX 样式,并直接转换。我一直在使用它,我非常喜欢它。

我希望降价只包含多降价。会比较好。

编辑:Multimarkdown 将生成 html、latex 和其他一些格式。html 可以附带您选择的样式表。如果我没记错的话,它也会转换成 MathML,它会在 Firefox 和 Safari/Chrome 中显示。

于 2010-02-03T16:27:17.153 回答
6

RStudio有一个很好的免费 IDE,它允许 Markdown 和 LaTeX。

于 2012-11-29T02:03:56.103 回答
6

kramdown 完全按照您的描述进行:

https://kramdown.gettalong.org/syntax.html#math-blocks

而且它比 Markdown 更可靠、更明确。

于 2012-11-29T02:25:33.160 回答
5

您可能会发现mimeTeX很有用。

于 2010-02-03T00:40:01.593 回答
3

嘿,这可能不是最理想的解决方案,但它对我有用。我最终创建了一个 Python-Markdown LaTeX 扩展。

https://github.com/justinvh/Markdown-LaTeX

它使用 $math$ 和 %text% 语法增加了对内联数学和文本表达式的支持。该扩展是一个预处理器,它将使用 latex/dvipng 为相应的方程式/文本生成 png,然后对数据进行 base64 编码以直接内联图像,而不是使用外部图像。

然后将数据放入一个简单分隔的缓存文件中,该文件将表达式编码为 base64 表示。这限制了乳胶实际必须运行的次数。

这是一个例子:

%Hello, world!% This is regular text, but this: $y = mx + b$ is not.

输出:

$ markdown -x latex test.markdown
<p><img class='latex-inline math-false' alt='Hello, world!' id='Helloworld' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAAAQBAMAAABpWwV8AAAAMFBMVEX///8iIiK6urpUVFTu7u6YmJgQEBDc3NxERESqqqqIiIgyMjJ2dnZmZmbMzMwAAAAbX03YAAAAAXRSTlMAQObYZgAAAVpJREFUKM9jYICDOgb2BwzYAVji8AQg8fb/PZ79u4AMvv0Mrz/gUA6W8F7AmcLAsJuBYT7Y1PcMfLiUgyWYF/B8Z2DYAVReABKrZ2DHpZwdopzrA0nKOeHKj66CKOcKPQJWwJo2NVFhfwCQyymhYwCUYD0avIApgYFh2927/QUcE3gDwMpvMhRCDJzNMIPhKZg7UW8DUOIMg9sCPgGo6e8ZODeAlAP9xLEArNy/IIwhAMx9D3IM+3cgi70BqnxZaNQFkHJWAQbeBrByjgURExaAuc9AyjnB5hjAlEO9ygVXzrplpskEMPchQvkBmGMcGApgjjkAVs7yhyWVAcwFK2f/AlJeAI0m5gMsEK+aMhQ6aDuA1DcDIZirBg7IOwxlB5g2QBJBF8OZVUz95hqfC3hOXWGYrwBSHskwk4EByGXab8QAlOBaGizFKYAtUlgUGEgBTCSpZnDCLQUA+y6MXeYnPDgAAAAASUVORK5CYII='> This is regular text, but this: <img class='latex-inline math-true' alt='y = mx + b' id='ymxb' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFIAAAAOBAMAAABOTlYkAAAAMFBMVEX///9ERETu7u4yMjK6urp2dnZUVFSIiIjMzMwQEBDc3NwiIiJmZmaYmJiqqqoAAADS00rKAAAAAXRSTlMAQObYZgAAAOtJREFUKM9jYCAACsCk4wYGgiABTLInEKuS+QGxKvkVGBj47jBwI8tcffI84e45BoZ7GVcLECo9751iWLeSoRPITBQEggMMDBy9sxj2MDgz8DIE8yCpPMxwjWFBGUMMkpFcbAEMvxjKGLgYxIE8NkHBiYIyQMY+hmoGhi0Mdsi2czawbGCQBTJ+ILvzE0MaA9MHIIWwnWE9A+sBpk8LGDgmMCnAVXJNYPgCJHhRQvUiA/cDXoECZx4DXoSZTBtYgaaEPw5AVnkOGBRc5xTcbsReQrL9+nWwyxbgC88DcJZ+QygDcYD1+QPiFAIAtLA8KPZOGFEAAAAASUVORK5CYII='> is not.</p>

如您所见,这是一个详细的输出,但这真的不是问题,因为您已经在使用 Markdown :)

于 2011-04-05T06:51:37.493 回答
2

是的,但你必须自己破解一点。我编写了一个过滤器,将乳胶标签$\some\inline\latex$$$\some\equation$$适当的图像标签替换为mimetex.cgi脚本。整个过程用了 5 分钟。

警告:非常丑陋...

#!/usr/bin/env python
import sys, markdown,re

MIMETEX_LOC="http://some.server.com/cgi-bin/mimetex.cgi"

def sanitizeLatex(text):
    return re.sub(r"\\",r"%5C", text)

def wrapLatexBlock(text):
    return '<img alt="equation" class="block" src="%s?%s"></img>'%(MIMETEX_LOC,text)

def wrapLatexInline(text):
    return '<img alt="equation" class="inline" src="%s?%s"></img>'%(MIMETEX_LOC,text)

def prepLatexBlock(matchobj):
    return wrapLatexBlock(sanitizeLatex(matchobj.group()[2:-2]))

def prepLatexInline(matchobj):
    return wrapLatexInline(sanitizeLatex(matchobj.group()[1:-1]))


if __name__ == "__main__":
    # initialise markdown
    md=markdown.Markdown()
    raw_md=open(sys.argv[1],"r").read()

    ##
    # deal with embedded latex
    ##
    raw_md=re.sub(r'\$\$(.*?)\$\$',prepLatexBlock, raw_md)
    raw_md=re.sub(r'\$(.*?)\$',prepLatexInline, raw_md)

    ##
    # once latex is parsed, convert md to html
    ##
    main_html=md.convert(raw_md)

    # hey presto!
    print(main_html)

当然,您必须自己为 .block 和 .inline 图像定义适当的 css...

于 2010-02-03T00:49:59.850 回答
2

我现在才遇到这个讨论,所以我希望我的评论仍然有用。我参与了 MathJax,根据我对您的情况的理解,我认为这将是解决问题的好方法:您将 LaTeX 代码保持原样,让 MathJax 在查看时呈现数学。

你有什么理由喜欢图片吗?

于 2011-01-17T21:38:23.777 回答
1

可以使用 Lunamark 代码在 Lua 中解析 Markdown(参见其Github repo),这意味着 Markdown 可以直接由 Luatex 中的宏解析,并支持转换为 Pandoc 支持的许多格式(即,该库非常适合在lualatex、、contextMetafun、Plain Luatex 和texlua脚本中使用)。

该项目由Pandoc 的作者John MacFarlane发起,该工具的开发与 Pandoc 的开发非常密切,并且具有相似(即优秀)的质量。

Khaled Hosny编写了一个 Context 模块,提供方便的宏支持。 Michal 对Is there any package with Markdown support?的回答 问题给出了为 Latex 提供类似支持的代码。

于 2010-02-04T06:35:31.490 回答
1

您使用什么语言?

如果您可以使用 ruby​​,则可以将maruku配置为使用各种 latex->MathML 转换器处理数学。 Instiki使用这个。也可以扩展 PHPMarkdown 以使用 itex2MML 以及转换数学。基本上,您在 Markdown 引擎中的适当位置插入额外的步骤。

因此,使用 ruby​​ 和 PHP,就完成了。我想这些解决方案也可以适用于其他语言——我已经获得了 itex2MML 扩展来生成 perl 绑定。

于 2010-05-07T14:02:29.780 回答
1

当我找到teqhtml时,我正在寻找完全相同的东西。它将 $ 和 $$ 方程转换为图像,并具有将结果图像与周围文本垂直对齐的好处。文档不多,但很简单。

希望它可以帮助一些未来的读者。

于 2011-02-13T17:46:23.553 回答
1

很抱歉引起了一个非常老的线程,但我已经使用jemdoc几年了,它真的很棒。

于 2012-04-16T18:04:24.333 回答