Як я можу змішувати 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.

Я впевнений, що ця проблема була вирішена, але я не зміг відгадати правильні пошукові терміни. Будь-які пропозиції, як її вирішити або де шукати існуюче рішення?


EDIT : Встановивши mathTeX, я можу сказати, що код нестабільний, що він порушує стандарт ієрархії Linux Filesystem і що це аматорська робота - і в хорошому, і в поганому розумінні цього слова. Код настільки складний, що явних помилок немає. Я буду шукати альтернативи.

Також зрозуміло, що внизу рішення базуються на основі dvipng.


Один рік пізніше : я ніколи не отримував безпроблемної інтеграції, на яку я сподівався, але я нахиляюся над сценарієм власного придумування. Виявляється, замість dvipngнього трохи простіше використовувати dvips -Eі convertпрограму ImageMagick. Переваги - це трохи більше контролю над такими речами, як масштабування, та легкість створення прозорого фону. Цікаві можуть оглянути цей приклад .

Я не можу рекомендувати це рішення нікому. Але я також не можу рекомендувати MathTeX.


Хороші запитання. Я підготувався безпосередньо до LaTeX, але це мало слово для цієї мети, навіть використовуючи auxtex ...
dmckee --- колишній кошеня-модератор

6
Ви пробували Пандока? Він не тільки сам перетворює Markdown + LaTeX у (що завгодно), але і з його останньою версією дозволяє писати сценарії, які працюють на дереві розбору, щоб ви могли легко робити те, що хочете.
ShreevatsaR

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

4
настільки складний, що явних помилок немає - я пропустив цю приємну довідку вперше, коли прочитав її.
Чарльз Стюарт

6
Чи може хтось пояснити, як це питання поза темою?
AnnanFay

Відповіді:



41

Можливо, mathJAX - це квиток. Він побудований на jsMath , старовинній бібліотеці JavaScript 2004 року.

З 5 лютого 2015 року я перейшов би рекомендувати KaTeX - найпопулярнішу бібліотеку Javascript LaTeX від Ханської академії.


Пов'язаний: 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

Я відповім на ваше запитання зустрічним запитанням ...

Що ви думаєте про Org-режимі? Це не так чисто, як 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 |

представляє лише те, що ви думаєте, що це буде ...

А латекс відображається шматками, використовуючи текс-режим попереднього перегляду-латекс.


1
Я переглянув org-режим, і хоча вбудований 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 має хороший безкоштовний IDE, який дозволяє використовувати 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
Куайна

3

Гей, це може бути не найбільш ідеальним рішенням, але це працює для мене. Я в кінцевому підсумку створив розширення LaTeX для Python-Markdown.

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

Він додає підтримку вбудованої математики та текстових виразів, використовуючи синтаксис $ math $ та% text%. Розширення є препроцесором, який використовуватиме латекс / 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

Якою мовою ви користуєтесь?

Якщо ви можете використовувати рубін, то maruku можна налаштувати на обробку математики, використовуючи різні латексні> MathML-перетворювачі. Інстикі використовує це. Також можливо розширити PHPMarkdown для використання itex2MML, а також для перетворення математики. В основному ви вставляєте додаткові кроки в механізм Markdown у відповідних точках.

Так що з рубіном та PHP це робиться. Я думаю, ці рішення також можуть бути адаптовані до інших мов - я отримав розширення itex2MML, щоб створити також прив’язки perl.


1

Я шукав саме те саме, коли знайшов teqhtml . Це робить перетворення рівнянь $ і $$ у зображення із приємним бонусом вирівнювання отриманого зображення вертикально з навколишнім текстом. Не багато док, але це досить просто.

Сподіваюся, це допоможе деяким майбутнім читачам.


1

Вибачте, що ви вже справді стару нитку, але я вже два роки використовую jemdoc, і це справді чудово.


1

Можна проаналізувати Markdown у Lua, використовуючи код Lunamark (див. Його Github repo ), це означає, що Markdown може бути проаналізований безпосередньо макросами в Luatex і підтримує перетворення у багато форматів, підтримуваних Pandoc (тобто бібліотека добре підходить для використання в lualatex, context, Metafun, Plain LuaTeX і texluaскрипти).

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

Халед Хосні написав модуль контексту, що забезпечує зручну підтримку макрокоманд. Відповідь Міхала на те, чи є пакет із підтримкою Markdown? питання дає код, що забезпечує аналогічну підтримку для Latex.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.