Как я могу смешать 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-файл с сглаживанием, который я мог бы затем включить в свой Markdown через <img>тег HTML . Но я абсолютно не знаю, как взять фрагмент LaTeX и получить хорошее изображение, которое

  • Имеет правильную ограничивающую рамку
  • Сглаживается

Все, что я знаю, - это получать полные страницы в форматах DVI, PostScript или PDF.

Я уверен, что эта проблема была решена, но я не смог угадать правильные условия поиска. Любые предложения, как решить это или где искать существующее решение?


РЕДАКТИРОВАТЬ : Установив mathTeX, я могу сказать, что код негибкий, что он нарушает стандарт иерархии файловых систем Linux, и что это любительская работа - как в хорошем, так и в плохом смысле этого слова. Код настолько сложен, что нет очевидных ошибок. Я буду искать альтернативы.

Также ясно, что в основе решения лежат dvipng.


ОКОЛО ГОДА : я так и не получил плавную интеграцию, на которую надеялся, но я придумываю сценарий своего собственного изобретения. Получается, что вместо dvipngнего немного удобнее использовать dvips -Eи convertпрограмму ImageMagick. Преимущества - немного больший контроль над такими вещами, как масштабирование, и простота создания прозрачного фона. Любопытный может проверить этот пример .

Я не могу рекомендовать это решение никому. Но я также не могу рекомендовать MathTeX.


Хорошие вопросы Я сделал свою подготовку непосредственно в LaTeX, но для этой цели это немного сложно, даже используя auctex ...
dmckee - котенок экс-модератора

6
Ты пробовал Пандок? Он не только сам конвертирует Markdown + LaTeX в (что угодно), но также, с его последней версией, он позволяет вам писать скрипты, которые работают с деревом разбора, так что вы можете легко делать то, что вы хотите.
ShreevatsaR

@ShreevatsaR Я собираюсь попробовать и pandoc, и multimarkdown, вероятно, этим летом.
Норман Рэмси

4
настолько сложный, что нет очевидных ошибок - я пропустил эту приятную ссылку в первый раз, когда я ее прочитал.
Чарльз Стюарт

6
Может кто-нибудь объяснить, как этот вопрос не по теме?
AnnanFay

Ответы:



41

Возможно, mathJAX это билет. Он построен на jsMath , винтажной JavaScript-библиотеке 2004 года.

С 5 февраля 2015 года я бы рекомендовал KaTeX - наиболее производительную библиотеку Javascript LaTeX от Khan Academy.


Связанный: stackoverflow.com/questions/11256433/… Я также рассматриваю серверную сторону Katex, например, с github.com/asciidoctor/asciidoctor/pull/3338
Сиро Сантилли 法轮功 冠状 病 六四 事件 法轮功

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, если вы не хотите использовать онлайн-дистрибутив, но вам может потребоваться разместить его через локальный веб-сервер.

ОБНОВЛЕНИЕ : в эти дни я просто использую pandoc вместо канонической уценки, но выше все еще полезно.


Примечание на будущее: cdn.mathjax.org близится к концу, проверьте mathjax.org/cdn-shutting-down для подсказок по миграции (и, возможно, обновите ваш пост для будущих читателей).
Питер Краутцбергер

12

Я отвечу на ваш вопрос встречным вопросом ...

Что вы думаете об орг-режиме? Он не такой чистый, как Markdown, но он похож на Markdown, и с ним мне так же легко работать, и он позволяет встраивать латекс. Ср http://www.gnu.org/software/emacs/manual/html_node/org/Embedded-LaTeX.html

постскриптум

Если вы еще не видели режим org, у него есть одна сильная сторона в качестве универсального «естественного языка разметки» над Markdown, а именно его обработка таблиц. Источник:

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

представляет только то, что вы думаете, что это будет ...

А латекс рендерит по частям с помощью превью-латекса tex-mode.


1
Я посмотрел на org-mode, и хотя встроенный LaTeX кажется очень хорошо сделанным, это выглядит как полное излишество для того, что я хочу (типично для emacs). Интересно отметить, что основной движок рендеринга снова dvipng. Проблема с таблицами важна, но я уже написал препроцессор для ее решения :-) +1
Норман Рэмси

8

Вы должны посмотреть на multimarkdown http://fletcherpenney.net/multimarkdown/

он поддерживает метаданные (заголовки, ключевые слова, дату, автора и т. д.), таблицы, asciimath, mathml, черт возьми, я уверен, что вы можете вставить латексный математический код прямо там. это в основном расширение для уценки, чтобы добавить все эти другие очень полезные функции. Он использует XSLT, так что вы можете легко создавать собственные стили LaTeX и напрямую преобразовывать их. Я использую это все время, и мне это очень нравится.

Я хотел бы, чтобы уценка включала бы только уценку. это было бы довольно приятно.

Изменить : Multimarkdown будет производить HTML, латекс и несколько других форматов. HTML может прийти с таблицей стилей на ваш выбор. он также преобразуется в MathML, который отображается в Firefox и Safari / Chrome, если я правильно помню.


Выглядит сложнее, чем я хочу, и не совсем понятно, что такое выразительная сила (кроме MathML, включенного в качестве ссылки0).
Норман Рэмси

6

RStudio имеет хорошую бесплатную среду разработки, которая позволяет использовать Markdown и LaTeX.


Но позволяет ли это объединить их в одном документе / предложении, как об этом просит ФП?
Мат

Вы можете встроить уравнения в режиме уценки. Смотрите примеры на rstudio.com/ide/docs/authoring/using_markdown_equations
Роман Луштрик

6

kramdown делает именно то, что вы описываете:

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

И это намного надежнее и четче, чем уценка.


похоже, эта страница в данный момент не работает, но вот страница, на которую она перенаправляла 301 в соответствии с машиной обратного хода: kramdown.gettalong.org:80/
Derwent

5

Вы можете найти mimeTeX полезным.


2
Преемник mathTeX выглядит еще лучше - и ясно, что dvipngэто рабочая лошадка. Спасибо за отличный указатель! +1
Норман Рэмси

1
Теперь я бы порекомендовал KaTeX - наиболее производительную библиотеку Javascript LaTeX от Khan Academy.
duffymo

Ссылка была изменена на: forkosh.com/mimetex.html
quine

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)

Конечно, вы должны сами определить соответствующий CSS для изображений .block и .inline ...


2

Я столкнулся с этим обсуждением только сейчас, поэтому я надеюсь, что мой комментарий все еще полезен. Я связан с MathJax и, насколько я понимаю вашу ситуацию, я думаю, что это был бы хороший способ решить проблему: вы оставляете свой код LaTeX как есть и позволяете MathJax отображать математику при просмотре.

Есть ли причина, по которой вы бы предпочли изображения?


1
Некоторые сайты обмена стеками Math.Se, Physics.SE и т. Д. ... сейчас используют MathJax, хотя руководство считает, что MathJax слишком тяжел для развертывания, за исключением случаев, когда это абсолютно необходимо. Но это не относится к презентациям, поскольку требует выполнения работ в браузере.
dmckee --- котенок экс-модератора

1

Какой язык вы используете?

Если вы можете использовать ruby, то maruku можно настроить для обработки математических операций с использованием различных конвертеров latex-> MathML. Инстики использует это. Также возможно расширить PHPMarkdown, чтобы использовать itex2MML для преобразования математики. По сути, вы вставляете дополнительные шаги в движке Markdown в соответствующих точках.

Так что с ruby ​​и PHP это сделано. Я думаю, что эти решения также могут быть адаптированы к другим языкам - я получил расширение itex2MML для создания привязок perl.


1

Я искал точно то же самое, когда нашел teqhtml . Он выполняет преобразование уравнений $ и $$ в изображения с приятным бонусом выравнивания полученного изображения по вертикали с окружающим текстом. Не много документов, но это довольно просто.

Надеюсь, что это поможет некоторым будущим читателям.


1

Извините, что вызвал действительно старую ветку , но я использую jemdoc уже пару лет, и это действительно отлично.


1

Разобрать Markdown в Lua можно с помощью кода Lunamark (см. Его репозиторий Github ), что означает, что Markdown может быть проанализирован напрямую макросами в Luatex и поддерживает преобразование во многие форматы, поддерживаемые Pandoc (т. Е. Библиотека хорошо подходит для использования в lualatex, context, Metafun, Plain LuaTeX и texluaскрипты).

Проект был начат Джоном Макфарлэйном , автором Pandoc, и разработка инструмента очень близко отслеживает разработку Pandoc и имеет схожее (то есть, превосходное) качество.

Халед Хосни написал модуль Context, обеспечивающий удобную поддержку макросов. Ответ Михала на вопрос: есть ли пакет с поддержкой Markdown? Вопрос дает код, обеспечивающий аналогичную поддержку для латекса.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.