Como posso misturar o LaTeX com o Markdown? [fechadas]

181

Eu tenho usado o Markdown para anotações de aula, e é ótimo. Eu até faço algum pré-processamento no Markdown para poder fazer coisas como tabelas. Mas esse termo eu estou dando uma aula com muita matemática e eu adoraria poder colocar fórmulas LaTeX com Markdown, algo como isto:

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

Eu gostaria de poder pegar cada fragmento do LaTeX e pré-processá-lo em um bom arquivo PNG com suavização de borda que eu poderia incluir no meu Markdown por meio da <img>tag HTML . Mas eu não tenho absolutamente nenhuma idéia de como pegar um fragmento do LaTeX e obter uma boa imagem que

  • Tem a caixa delimitadora direita
  • É antialias

Tudo o que sei fazer é obter páginas inteiras nos formatos DVI, PostScript ou PDF.

Tenho certeza de que esse problema foi solucionado, mas não consegui adivinhar os termos de pesquisa corretos. Alguma sugestão de como resolvê-lo ou onde procurar uma solução existente?


EDIT : Depois de instalar o mathTeX, posso dizer que o código é inflexível, que viola o padrão Hierarquia do sistema de arquivos do Linux e que é um trabalho amador - nos sentidos bons e ruins dessa palavra. O código é tão complexo que não há falhas óbvias. Vou procurar alternativas.

Além disso, é claro que, no fundo, as soluções são baseadas dvipng.


UM ANO DEPOIS : Eu nunca tive a integração perfeita que esperava, mas estou mancando em um roteiro que eu mesmo planejei. Acontece que, em vez disso dvipng, é um pouco mais fácil de usar dvips -Ee o convertprograma do ImageMagick. Os benefícios são um pouco mais de controle de coisas como dimensionamento e facilidade de criar um plano de fundo transparente. Os curiosos podem inspecionar este exemplo .

Não posso recomendar esta solução a ninguém. Mas também não posso recomendar o MathTeX.

Norman Ramsey
fonte
Boas perguntas. Fiz minha preparação diretamente no LaTeX, mas é um pouco prolixo para esse propósito, mesmo usando auctex ...
dmckee --- ex-moderador gatinho
6
Você experimentou Pandoc? Ele não apenas converte o Markdown + LaTeX para (o que for), mas também, com seu lançamento mais recente, permite escrever scripts que funcionam na árvore de análise, para que você possa fazer facilmente o que deseja.
precisa
@ShreevatsaR Vou tentar o pandoc e o multimarkdown, provavelmente neste verão.
Norman Ramsey
4
tão complexo que não há falhas óbvias - perdi essa referência agradável na primeira vez que a li.
Charles Stewart
6
Alguém pode explicar como esta questão está fora de tópico?
precisa saber é o seguinte

Respostas:

25

Adicione o seguinte código ao topo dos seus arquivos Markdown para obter suporte à renderização 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>

e, em seguida, `$ x ^ 2 $` ou `$$ x ^ 2 $$` serão renderizados conforme o esperado :-)

Você sempre pode instalar uma versão local do MathJax se não quiser usar a distribuição online, mas pode ser necessário hospedá-la através de um servidor da web local.

ATUALIZAÇÃO : hoje em dia eu apenas uso pandoc em vez de remarcação canônica, mas o acima exposto ainda é útil.

fommil
fonte
Nota do futuro: cdn.mathjax.org está chegando ao fim de sua vida útil, consulte mathjax.org/cdn-shutting-down para obter dicas de migração (e talvez atualize sua postagem para futuros leitores).
Peter Krautzberger
12

Eu responderei sua pergunta com uma contra-pergunta ...

O que você acha do modo Org? Não é tão puro quanto o Markdown, mas é semelhante ao Markdown, e acho fácil trabalhar com ele, e permite incorporar o Latex. Cf. http://www.gnu.org/software/emacs/manual/html_node/org/Embedded-LaTeX.html

Postscript

Caso você não tenha analisado o modo organizacional, ele tem uma grande força como "linguagem de marcação natural" de propósito geral sobre o Markdown, ou seja, o tratamento de tabelas. A fonte:

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

representa exatamente o que você acha que vai ...

E o Latex é renderizado em pedaços usando o preview-latex do modo tex.

Charles Stewart
fonte
1
Eu olhei para o modo organizacional e, embora o LaTeX incorporado pareça muito bem feito, parece um exagero total para o que eu quero (típico do emacs). Curiosamente, observo que o mecanismo de renderização subjacente está novamente dvipng. O problema da tabela é importante, mas eu já escrevi um pré-processador para resolvê-lo :-) +1
Norman Ramsey
8

você deve consultar multimarkdown http://fletcherpenney.net/multimarkdown/

tem suporte para metadados (cabeçalhos, palavras-chave, data, autor, etc), tabelas, asciimath, mathml, inferno, eu tenho certeza que você poderia colocar o código matemático de látex ali. é basicamente uma extensão do markdown para adicionar todos esses outros recursos muito úteis. Ele usa XSLT, para que você possa criar facilmente seus próprios estilos de LaTeX e convertê-lo diretamente. Eu uso o tempo todo e gosto muito.

Eu gostaria que a remarcação incorporasse apenas o multi-contagem decrescente. seria bem legal.

Edit : O Multimarkdown produzirá html, latex e alguns outros formatos. O html pode vir com uma folha de estilos de sua escolha. Ele também será convertido em MathML, que é exibido no Firefox e Safari / Chrome, se bem me lembro.

Mica
fonte
Parece mais complicado do que o que eu quero, e é pouco claro qual é o poder expressivo (além do MathML é incorporado por reference0).
Norman Ramsey
6

O RStudio possui um bom IDE gratuito que permite o Markdown e o LaTeX.

rsacc
fonte
Mas permite combiná-los no mesmo documento / frase, como o OP está pedindo?
Matt
Você pode incorporar equasões no modo de remarcação. Veja exemplos em rstudio.com/ide/docs/authoring/using_markdown_equations
Roman Luštrik
6

O kramdown faz exatamente o que você descreve:

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

E é muito mais confiável e bem definido que o Markdown.

mate
fonte
parece que esta página está inativa no momento, mas esta é a página que costumava ser redirecionada para o 301, de acordo com a máquina de wayback: kramdown.gettalong.org:80/
Derwent
5

Você pode achar o mimeTeX útil.

Ignacio Vazquez-Abrams
fonte
2
O sucessor mathTeX parece ainda melhor - e é claro que esse dvipngé o cavalo de batalha. Obrigado por um ótimo ponteiro! +1
Norman Ramsey
1
Agora eu recomendaria o KaTeX - a biblioteca Javascript LaTeX de maior desempenho da Khan Academy.
Duffymo
O link foi alterado para: forkosh.com/mimetex.html
quine
3

Ei, essa pode não ser a solução mais ideal, mas funciona para mim. Acabei criando uma extensão Python-Markdown LaTeX.

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

Ele adiciona suporte para expressões matemáticas e de texto embutidas usando a sintaxe $ math $ e% text%. A extensão é um pré-processador que usará latex / dvipng para gerar pngs para as respectivas equações / texto e, em seguida, base64 codificará os dados para alinhar as imagens diretamente, em vez de ter imagens externas.

Os dados são então colocados em um arquivo de cache delimitado simples que codifica a expressão na representação base64. Isso limita o número de vezes que o látex realmente precisa ser executado.

Aqui está um exemplo:

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

A saída:

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

Como você pode ver, é uma saída detalhada, mas isso realmente não é um problema, pois você já está usando o Markdown :)

Justin Van Horne
fonte
2

sim, mas você terá que cortar um pouco você mesmo. Eu escrevi um filtro que substitui as tags de látex $\some\inline\latex$ou $$\some\equation$$por tags de imagem apropriadas em um script mimetex.cgi . Demorou 5 minutos.

Aviso: espetacularmente feio ...

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

Obviamente, você deve definir o CSS apropriado para imagens .block e .inline ...

brice
fonte
2

Só me deparei com essa discussão agora, então espero que meu comentário ainda seja útil. Estou envolvido com o MathJax e, pelo que entendi da sua situação, acho que seria uma boa maneira de resolver o problema: você deixa o código do LaTeX como está e deixa o MathJax renderizar a matemática ao vê-lo.

Existe alguma razão para você preferir imagens?

Hylke Koers
fonte
1
Alguns sites Pilha de câmbio Math.Se, Physics.SE, etc ... não usar MathJax agora, embora a posição da administração é que MathJax é pesado demais para ser implantado exceto quando absolutamente necessário. Mas isso não se aplica às apresentações, pois exige que os trabalhos sejam executados em um navegador.
dmckee --- ex-moderador gatinho
1

Que linguagem você está usando?

Se você pode usar ruby, o maruku pode ser configurado para processar matemática usando vários conversores de látex-> MathML. Instiki usa isso. Também é possível estender o PHPMarkdown para usar o itex2MML e também converter matemática. Basicamente, você insere etapas extras no mecanismo Markdown nos pontos apropriados.

Então, com ruby ​​e PHP, isso é feito. Eu acho que essas soluções também podem ser adaptadas para outros idiomas - eu obtive a extensão itex2MML para produzir ligações perl também.

Andrew Stacey
fonte
1

Eu estava procurando exatamente a mesma coisa quando encontrei teqhtml . Ele faz a conversão das equações $ e $$ em imagens com o bom bônus de alinhar a imagem resultante verticalmente com o texto ao redor. Não há muitos documentos, mas é bem direto.

Espero que ajude alguns futuros leitores.

John
fonte
1

Desculpe despertar um encadeamento muito antigo, mas uso o jemdoc há alguns anos e é realmente excelente.

traviscj
fonte
1

É possível analisar o Markdown em Lua usando o código Lunamark (consulte seu repositório no Github ), o que significa que o Markdown pode ser analisado diretamente por macros no Luatex e suporta a conversão para muitos dos formatos suportados pelo Pandoc (ou seja, a biblioteca é adequada) para usar em lualatex, context, Metafun, Planície luatex e texluascripts).

O projeto foi iniciado por John MacFarlane , autor de Pandoc, e o desenvolvimento da ferramenta acompanha o Pandoc de perto e é de qualidade semelhante (ou seja, excelente).

Khaled Hosny escreveu um módulo de contexto, fornecendo conveniente suporte a macro. Resposta de Michal ao Existe algum pacote com suporte para Markdown? A pergunta fornece código que fornece suporte semelhante para o látex.

Charles Stewart
fonte