如何将LaTeX与Markdown混合使用?[关闭]


181

我一直在用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 Filesystem Hierarchy标准,并且无论从好还是坏的意义上讲都是业余工作。代码是如此复杂,以至于没有明显的错误。我将寻找替代品。

同样,很显然,解决方案的底部是基于的dvipng


一年以后:我一直没有得到我一直希望的无缝集成,但是我一直在自己设计的脚本上学习。原来的而不是dvipng更容易一点使用dvips -EconvertImageMagick的计划。好处是可以更好地控制缩放等操作,并易于制作透明背景。好奇的可以检查这个例子

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


好问题。我已经直接在LaTeX中完成了准备工作,但是为此即使使用auctex
还是有些麻烦

6
您尝试过Pandoc吗?它不仅可以将Markdown + LaTeX本身转换为(任何形式),而且还可以使用其最新版本将您编写的脚本用于解析树,因此您可以轻松地执行所需的操作。
ShreevatsaR

@ShreevatsaR我可能要在今年夏天尝试pandoc和multimarkdown。
诺曼·拉姆齐

4
如此复杂,没有明显的缺陷 -第一次阅读时,我错过了这份令人愉快的参考资料。
查尔斯·斯图尔特

6
有人可以解释这个问题如何脱离话题吗?
AnnanFay 2013年

Answers:




25

将以下代码添加到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的本地版本,但是您可能需要通过本地Web服务器托管它。

更新:这些天我只使用pandoc而不是规范的markdown,但是以上内容仍然有用。


未来的注意事项:cdn.mathjax.org即将到期,请查看mathjax.org/cdn-shutting-down以获取迁移提示(并可能为将来的读者更新您的文章)。
Peter Krautzberger '17

12

我会反问您的问题...

您如何看待组织模式?它不像Markdown那样纯净,但类似于Markdown,我发现它很容易使用,并且可以嵌入Latex。cf. 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进行分段渲染。


1
我查看了组织模式,尽管嵌入式LaTeX看起来做得很好,但对于我想要的东西(典型的emacs)来说似乎完全过头了。有趣的是,我注意到基础渲染引擎再次出现了dvipng。表问题是一个重要的问题,但是我已经写了一个预处理器来解决它:-) +1
Norman Ramsey 2010年

8

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

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

我希望markdown会包含multimarkdown。这将是相当不错的。

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


看起来比我想要的要复杂,而且还不清楚表达力是什么(不是MathML包含在reference0中)。
诺曼·拉姆齐




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了:)


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 ...


2

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

有什么理由让您更喜欢图像?


1
某些Stack Exchange网站Math.Se,Physics.SE等现在确实使用MathJax,尽管管理的位置是MathJax过于繁重,无法部署,除非绝对必要。但这不适用于演示文稿,因为它要求作品必须在浏览器中运行。
dmckee ---前主持人小猫,

1

您使用什么语言?

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

因此,使用ruby和PHP即可完成此操作。我猜这些解决方案也可能适用于其他语言-我已经获得了itex2MML扩展,也可以生成perl绑定。


1

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

希望它对将来的读者有所帮助。



1

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

该项目由Pandoc的作者John MacFarlane启动,该工具的开发非常紧密地跟踪Pandoc的开发,并且质量相似(即出色)。

Khaled Hosny编写了一个Context模块,提供了便利的宏支持。 Michal对“ 是否有Markdown支持的软件包”的回答问题给出了为Latex提供类似支持的代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.