Jak mogę połączyć LaTeX z Markdown? [Zamknięte]

181

Używam Markdown do notatek z zajęć i to świetnie. Robię nawet wstępne przetwarzanie Markdown, aby móc robić rzeczy takie jak tabele. Ale w tym semestrze prowadzę zajęcia z dużą ilością matematyki i chciałbym móc umieścić formuły LaTeX w Markdown, mniej więcej tak:

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

Chciałbym móc wziąć każdy fragment LaTeXa i wstępnie przetworzyć go w ładny, antyializowany plik PNG, który mógłbym następnie dołączyć do mojego Markdown za pomocą <img>znacznika HTML . Ale absolutnie nie mam pojęcia, jak wziąć fragment LaTeXa i uzyskać ładny obraz

  • Ma odpowiednią ramkę ograniczającą
  • Jest antyializowany

Wiem tylko, jak uzyskać pełne strony w formatach DVI, PostScript lub PDF.

Jestem pewien, że ten problem został rozwiązany, ale nie byłem w stanie odgadnąć właściwych wyszukiwanych haseł. Wszelkie sugestie, jak je rozwiązać lub gdzie szukać istniejącego rozwiązania?


EDYCJA : Po zainstalowaniu mathTeX mogę powiedzieć, że kod jest nieelastyczny, że narusza standard Linux File System Hierarchy i że jest to praca amatorska - zarówno w dobrym, jak i złym znaczeniu tego słowa. Kod jest tak skomplikowany, że nie ma oczywistych błędów. Będę szukał alternatyw.

Oczywiste jest również, że u dołu rozwiązania są oparte dvipng.


JEDEN ROK PÓŹNIEJ : Nigdy nie udało mi się uzyskać bezproblemowej integracji, na którą liczyłem, ale utykam według własnego scenariusza. Okazuje się, że zamiast dvipngtego jest nieco łatwiejszy w użyciu dvips -Ei convertprogramie ImageMagick. Korzyści to nieco większa kontrola takich rzeczy jak skalowanie i łatwość tworzenia przezroczystego tła. Ciekawi mogą sprawdzić ten przykład .

Nie mogę nikomu polecić tego rozwiązania. Ale nie mogę też polecić MathTeX.

Norman Ramsey
źródło
Dobre pytania Przygotowałem się bezpośrednio w LaTeX, ale jest to trochę nieprzyjemne, nawet przy użyciu auctex ...
dmckee --- były moderator kociak
6
Czy próbowałeś Pandoc? Sama nie tylko konwertuje Markdown + LaTeX na (cokolwiek), ale także, dzięki najnowszej wersji, pozwala pisać skrypty działające na drzewie analizy, dzięki czemu możesz łatwo robić, co chcesz.
ShreevatsaR
@ShreevatsaR Spróbuję zarówno pandoc, jak i multimarkdown, prawdopodobnie tego lata.
Norman Ramsey,
4
tak skomplikowane, że nie ma oczywistych błędów - po raz pierwszy tęskniłem za przyjemną referencją.
Charles Stewart
6
Czy ktoś może wyjaśnić, dlaczego to pytanie jest nie na temat?
AnnanFay,

Odpowiedzi:

25

Dodaj następujący kod na górze plików Markdown, aby uzyskać obsługę renderowania 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>

a następnie `$ x ^ 2 $` lub `$$ x ^ 2 $$` będą renderowane zgodnie z oczekiwaniami :-)

Zawsze możesz zainstalować lokalną wersję MathJax, jeśli nie chcesz korzystać z dystrybucji online, ale może być konieczne hostowanie jej przez lokalny serwer WWW.

AKTUALIZACJA : obecnie używam pandoc zamiast kanonicznego markdown, ale powyższe jest nadal przydatne.

Fommil
źródło
Uwaga z przyszłości: cdn.mathjax.org zbliża się ku końcowi, sprawdź mathjax.org/cdn-shutting-down, aby uzyskać porady dotyczące migracji (i być może zaktualizuj swój post dla przyszłych czytelników).
Peter Krautzberger
12

Odpowiem na twoje pytanie za pomocą kontr-pytania ...

Co sądzisz o trybie Org? Nie jest tak czysty jak Markdown, ale jest podobny do Markdown i uważam, że jest tak łatwy w obsłudze i pozwala na osadzanie lateksu. Por. http://www.gnu.org/software/emacs/manual/html_node/org/Embedded-LaTeX.html

Postscriptum

Jeśli nie spojrzałeś na tryb org, ma on jedną wielką zaletę jako „naturalny język znaczników” ogólnego zastosowania w stosunku do Markdown, a mianowicie jego traktowanie tabel. Źródło:

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

reprezentuje dokładnie to, co myślisz ...

Lateks jest renderowany w kawałkach za pomocą lateksu podglądu w trybie tekstowym.

Charles Stewart
źródło
1
Spojrzałem na tryb org i chociaż osadzony LaTeX wydaje się być bardzo dobrze zrobiony, wygląda na całkowitą przesadę w stosunku do tego, czego chcę (typowy dla emacsa). Co ciekawe, zauważam, że silnik renderowania leżący u podstaw jest ponownie dvipng. Problem ze stołem jest ważny, ale napisałem już preprocesor, aby go rozwiązać :-) +1
Norman Ramsey
8

powinieneś spojrzeć na multimarkdown http://fletcherpenney.net/multimarkdown/

obsługuje metadane (nagłówki, słowa kluczowe, datę, autora itp.), tabele, asciimath, matematyka, piekło, jestem pewien, że możesz tam wkleić kod matematyki lateksowej. jest to w zasadzie rozszerzenie do markdown, aby dodać wszystkie inne bardzo przydatne funkcje. Wykorzystuje XSLT, dzięki czemu możesz łatwo tworzyć własne style LaTeX i bezpośrednio je konwertować. Używam go cały czas i bardzo mi się podoba.

Chciałbym, aby obniżka obejmowała po prostu multimarkdown. byłoby raczej miło.

Edycja : Multimarkdown będzie produkować HTML, lateks i kilka innych formatów. HTML może pochodzić z wybranego arkusza stylów. przekształci się również w MathML, który wyświetla się w Firefox i Safari / Chrome, jeśli dobrze pamiętam.

Mika
źródło
Wygląda na bardziej skomplikowane niż to, czego chcę, i nie jest jasne, na czym polega moc ekspresji (inna niż MathML jest włączona przez odniesienie 0).
Norman Ramsey,
6

RStudio ma dobre darmowe IDE, które pozwala na Markdown i LaTeX.

rsacc
źródło
Ale czy pozwala to łączyć je w tym samym dokumencie / zdaniu, o co prosi OP?
mat.
Możesz osadzić równania w trybie przeceny. Zobacz przykłady na rstudio.com/ide/docs/authoring/using_markdown_equations
Roman Luštrik
6

kramdown robi dokładnie to, co opisujesz:

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

I jest o wiele bardziej niezawodny i dobrze zdefiniowany niż Markdown.

matowy
źródło
wygląda na to, że ta strona jest obecnie niedostępna, ale oto strona, do której przekierowywał 301 zgodnie z automatem: kramdown.gettalong.org:80/
Derwent
5

MimeTeX może się przydać.

Ignacio Vazquez-Abrams
źródło
2
Następca mathTeX wygląda jeszcze lepiej --- i jasne dvipngjest, że to koń roboczy. Dzięki za świetny wskaźnik! +1
Norman Ramsey
1
Teraz polecam KaTeX - najbardziej wydajną bibliotekę JavaScript LaTeX z Khan Academy.
duffymo
Link został zmieniony na: forkosh.com/mimetex.html
quine
3

Hej, to może nie jest najbardziej idealne rozwiązanie, ale działa dla mnie. W końcu stworzyłem rozszerzenie LaTeX dla Python-Markdown.

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

Dodaje obsługę wbudowanych wyrażeń matematycznych i tekstowych przy użyciu składni $ matematycznej $ i% text%. Rozszerzenie jest preprocesorem, który będzie używał lateksu / dvipng do generowania png dla odpowiednich równań / tekstu, a następnie base64 koduje dane w celu bezpośredniego wstawienia obrazów, zamiast mieć obrazy zewnętrzne.

Dane są następnie umieszczane w pliku pamięci podręcznej z ogranicznikami, który koduje wyrażenie do reprezentacji base64. Ogranicza to liczbę uruchomień lateksu.

Oto przykład:

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

Wyjście:

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

Jak widać, jest to pełne wyjście, ale to naprawdę nie jest problem, ponieważ już używasz Markdown :)

Justin Van Horne
źródło
2

tak, ale musisz trochę go zhakować. Napisałem filtr, który zastępuje znaczniki lateksowe $\some\inline\latex$lub $$\some\equation$$odpowiednimi znacznikami obrazu do skryptu mimetex.cgi . Zajęło to wszystkie 5 minut.

Ostrzeżenie: spektakularnie brzydkie ...

#!/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)

Oczywiście musisz sam zdefiniować odpowiedni css dla obrazów .block i .inline ...

brice
źródło
2

Spotkałem się z tą dyskusją dopiero teraz, więc mam nadzieję, że mój komentarz będzie nadal przydatny. Jestem zaangażowany w MathJax i z tego, jak rozumiem twoją sytuację, myślę, że byłby to dobry sposób na rozwiązanie problemu: zostaw swój kod LaTeX w obecnej postaci i pozwól MathJaxowi renderować matematykę podczas oglądania.

Czy jest jakiś powód, dla którego wolisz zdjęcia?

Hylke Koers
źródło
1
Niektóre strony Stos Exchange Math.Se, Physics.SE, etc ... nie używać mathjax teraz, choć pozycja zarządzania jest to, że mathjax jest zbyt ciężki, aby być wdrażane z wyjątkiem gdzie jest to absolutnie konieczne. Nie dotyczy to jednak prezentacji, ponieważ wymaga działania w przeglądarce.
dmckee --- były moderator kociak
1

Jakiego języka używasz?

Jeśli możesz używać ruby, maruku można skonfigurować do przetwarzania matematyki za pomocą różnych konwerterów lateks-> MathML. Instiki używa tego. Możliwe jest także rozszerzenie PHPMarkdown o użycie itex2MML, a także do konwersji matematyki. Zasadniczo wstawiasz dodatkowe kroki w silniku Markdown w odpowiednich punktach.

Tak jest w przypadku Ruby i PHP. Sądzę, że te rozwiązania można również dostosować do innych języków - otrzymałem rozszerzenie itex2MML do tworzenia również powiązań perla.

Andrew Stacey
źródło
1

Szukałem dokładnie tego samego, kiedy znalazłem teqhtml . Dokonuje konwersji równań $ i $$ na obrazy z ładną zaletą wyrównania wynikowego obrazu pionowo z otaczającym tekstem. Nie dużo doktorów, ale to całkiem proste.

Mam nadzieję, że pomoże to niektórym przyszłym czytelnikom.

Jan
źródło
1

Przepraszam, że wzbudziłem naprawdę stary wątek, ale używam jemdoc od kilku lat i jest naprawdę świetny.

traviscj
źródło
1

Możliwe jest parsowanie Markdown w Lua za pomocą kodu Lunamark (patrz jego repozytorium Github ), co oznacza, że ​​Markdown może być analizowany bezpośrednio przez makra w Luatex i obsługuje konwersję do wielu formatów obsługiwanych przez Pandoc (tj. Biblioteka jest dobrze dostosowana do wykorzystania w lualatex, context, Metafun, Zwykły LuaTeX i texluaskrypty).

Projekt został rozpoczęty przez Johna MacFarlane'a , autora Pandoc, a rozwój narzędzia śledzi rozwój Pandoc dość dokładnie i ma podobną (tj. Doskonałą) jakość.

Khaled Hosny napisał moduł kontekstowy, zapewniający wygodną obsługę makr. Odpowiedź Michała na pytanie Czy jest jakiś pakiet z obsługą Markdown? pytanie daje kod zapewniający podobne wsparcie dla lateksu.

Charles Stewart
źródło