如何将LaTeX与Markdown混合使用?

时间:2010-02-03 00:36:19

标签: html latex markdown mathematical-typesetting

我一直在使用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和ImageMagick的dvips -E程序更容易,而不是convert。这样做的好处是可以稍微控制缩放等内容,并且可以轻松实现透明背景。 好奇的人可以检查this example

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

15 个答案:

答案 0 :(得分:66)

您是否尝试过使用Pandoc

答案 1 :(得分:39)

也许mathJAX是票。它建立在jsMath上,这是一个2004年份的JavaScript库。

截至2015年2月5日,我转而推荐KaTeX - 来自可汗学院的大多数高性能Javascript LaTeX库。

答案 2 :(得分:21)

将以下代码添加到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而不是规范降价,但上述内容仍然有用。

答案 3 :(得分:11)

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

您如何看待组织模式?它不像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 |

代表你的想法......

使用tex-mode的preview-latex将Latex渲染成碎片。

答案 4 :(得分:8)

您应该查看multimarkdown http://fletcherpenney.net/multimarkdown/

它支持元数据(标题,关键字,日期,作者等),表格,asciimath,mathml,我敢肯定你可以在那里粘贴乳胶数学代码。它基本上是降价的扩展,以添加所有这些其他非常有用的功能。它使用XSLT,因此您可以轻松地制作自己的LaTeX样式,并直接进行转换。我一直都在使用它,我非常喜欢它。

我希望降价只会包含多标记。这会很不错。

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

答案 5 :(得分:6)

RStudio有一个很好的免费IDE,可以使用Markdown和LaTeX。

答案 6 :(得分:5)

kramdown正是你所描述的:

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

它比Markdown更可靠,更明确。

答案 7 :(得分:4)

您可能会发现mimeTeX有用。

答案 8 :(得分: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,这确实不是问题:)

答案 9 :(得分: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 images ...

定义合适的css

答案 10 :(得分:2)

我现在才想到这个讨论,所以我希望我的评论仍然有用。我参与了MathJax,从我如何理解你的情况来看,我认为这将是一个解决问题的好方法:你将LaTeX代码保留原样,让MathJax在查看时渲染数学。

你有什么理由想要图像吗?

答案 11 :(得分:1)

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

该项目由Pandoc的作者John MacFarlane启动,该工具的开发跟踪Pandoc非常接近并具有相似(即优秀)的质量。

Khaled Hosny编写了一个Context模块,提供了方便的宏支持。 Michal's answer to the Is there any package with Markdown support? question为代码提供了对Latex的类似支持。

答案 12 :(得分:1)

您使用的是哪种语言?

如果您可以使用ruby,则maruku可以配置为使用各种latex-&gt; MathML转换器处理数学。 Instiki使用此功能。也可以扩展PHPMarkdown以使用itex2MML来转换数学。基本上,您在适当的位置在Markdown引擎中插入额外的步骤。

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

答案 13 :(得分:1)

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

希望它有助于未来的读者。

答案 14 :(得分:1)

很抱歉找到一个非常老的帖子,但我已经使用jemdoc几年了,这真的非常棒。