Ipython: Números de equação no caderno.

Criado em 26 ago. 2013  ·  45Comentários  ·  Fonte: ipython/ipython

O LaTeX embutido do IPython não inclui numeração de equações. Seria ótimo se as sequências LaTeX que são normalmente numeradas (ou seja, blocos \begin{equation} ... \end{equation}) recebessem (opcional?) números. Um slam dunk seria se pudéssemos anexar referências a equações e referenciá-las de alguma forma mais tarde no texto.

notebook

Comentários muito úteis

isso já está resolvido ou devo +1 isso?

Todos 45 comentários

+1
Esta é uma característica bastante importante para qualquer tipo de documento matemático.
Acredito que o MathJax já tenha esse recurso:

http://docs.mathjax.org/en/latest/tex.html#automatic -equation-numbering

No que diz respeito às referências, acho que é crucial desenvolver um sistema genérico de referência cruzada com uma sintaxe unificada, e não um que seja específico para equações LaTeX (e backends LaTeX).

Concordo que deve haver um sistema genérico de referência cruzada, mas acrescentaria que também deve ser capaz de interagir com o código python. Isso permitiria que o látex no markdown fizesse referência a figuras produzidas no código.

Isso provavelmente teria que esperar até que um sistema para acessar variáveis ​​python de células markdown estivesse disponível, pois provavelmente usaria um sistema semelhante.

Isso também parece resolver o problema de forma mais completa http://stackoverflow.com/questions/18823779/ipython-notebook-and-mathjax-labeled-equations

@ahmadia qual é o problema por que as equações não podem ser numeradas por padrão? Não poder numerar e referenciar equações é algo que incomoda bastante atualmente.

+1. Parece que a implementação do #5921 permitiria isso facilmente.

+1. Espero que isso seja implementado muito em breve

+1

+1.
Estou usando notebooks ipython para complementar o material do curso para um curso de eletromagnetismo de nível júnior da universidade e estou fazendo isso como um caso de teste para saber se devemos promover uma ampla implementação de notebook ipython em todo o nosso currículo de graduação. A falta de numeração de equações consistente em um caderno, ou em seções de um caderno, é uma limitação séria, juntamente com a capacidade de referenciar números de equações no texto. Estou bem com essa numeração sendo específica para partes LaTeX de um notebook, especialmente se tentar uma abordagem mais geral significa uma espera mais longa para obter essa funcionalidade.

+1.
O mesmo aqui, estou escrevendo minhas anotações para um curso de cálculo numérico usando ipython e a numeração de referência está realmente ausente.

+1

Esta é a única coisa que me impede de usar iPython Notebooks como minha principal ferramenta de escrita de documentos (exceto pela falta de colaboração em tempo real, mas isso não é tão importante). Em vez disso, tenho que fazer rascunhos aqui e depois transferi-los para um editor LaTeX.

+1 :+1: Estamos usando isso para dar palestras e esse recurso é absolutamente necessário!

Ok, eu finalmente tentei a "solução" descrita neste post onde você modifica mathjaxutils.js. Contanto que você atualize a página da web do ipython notebook depois de fazer alterações nas células markdown que contêm látex, os números das equações aparecem e fazem isso na ordem correta. A atualização da página também corrige os rótulos, que não são resolvidos quando a célula na qual eles estão definidos é executada novamente (ou seja, shift-enter). No entanto, quando o notebook é renderizado em nbviewer.ipython.org, os números das equações estão completamente ausentes e os rótulos não são resolvidos, então eles são substituídos por "???" onde eles são referenciados em células de texto markdown. A conclusão é que isso não é uma solução para a maioria dos casos de uso, embora eu esteja feliz que o pôster original tenha feito a pergunta e descoberto isso.

Eu queria numerar equações retornadas por células de código.
Isso é o que eu usei: http://nbviewer.ipython.org/github/MalteJin/Manual-equation-numbering/blob/branch/Manual%20equation%20numbering.ipynb

^ Esta é a solução atualmente recomendada?

Ressalto. Estou usando os notebooks Jupyter para minhas anotações do curso e isso é um problema sério. Uma sintaxe conveniente para numeração manual de equações seria um compromisso decente?

Uma sintaxe conveniente para numeração manual de equações seria um compromisso decente?

Essa é uma boa ideia @poulson e existe a sintaxe \tag no MathJaX que suporta isso.
Tags de equação MathJax manuais no exemplo do Jupyter Notebook . Mesmas limitações (reexecutar uma célula Markdown fará com que o MathJaX quebre se você não atualizar o navegador), mas pelo menos você não precisa reconfigurar o notebook para fazer isso.

@ahmadia Obrigado! Reexecutar quebrar a célula é definitivamente um pouco frustrante, mas isso é um grande progresso de \begin{equation} não rotular!

@ahmadia É esperado que as referências da equação não resolvam no seu link ou no notebook ao vivo (mesmo após a atualização)?

Tente atualizar e execute todas as células. Eu não acho que os links funcionem no GitHub
porque o GH remove URLs.

No sábado, 3 de outubro de 2015, Jack Poulson [email protected] escreveu:

@ahmadia https://github.com/ahmadia É esperado que a equação
referências não resolvem em seu link ou no notebook ao vivo (mesmo após
refrescante)?


Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/ipython/ipython/issues/4113#issuecomment -145305340.

Isso não funcionou para mim, mas como tudo está sendo codificado, não vejo motivo para insistir em usar \ref . Portanto, codifiquei os números das equações para as referências e produzi o produto final que pode ser visto aqui: http://web.stanford.edu/class/math53/notebooks/Week2.html

Obrigado @poulson por empurrar isso. Eu sou atingido por isso repetidamente, e números de equações de hardcoding são muito ruins, mas o que se pode fazer... IPython deve ter suporte nativo para isso.

Melhor solução até agora, obrigado pessoal!

Se você incluir o código:

MathJax.Hub.Config({
  TeX: { equationNumbers: { autoNumber: "AMS" } }
});

em uma extensão javascript, ou mesmo em uma saída javascript no notebook, a numeração automática de equações será ativada. Ele terá todos os problemas que nos impedem de fazer isso por padrão, principalmente que os números das equações mathjax são ordenados por tempo de renderização, não por localização na página, portanto, a numeração só estará correta no carregamento da primeira página.

Na verdade, você pode redefinir a numeração da equação e renderizar novamente as equações no notebook.

Eu fiz uma extensão de notebook simples que faz isso:
https://github.com/ipython-contrib/IPython-notebook-extensions/pull/335

@juhasch ótimo! Dada a experiência muito ruim de números de equações na maioria das circunstâncias, acho que o padrão é a melhor escolha. Mas tornar isso uma opção de configuração de frontend com a ação de renumerar seria ótimo (o botão da barra de ferramentas provavelmente é um espaço muito precioso para se dedicar a ele, mas uma ação de menu seria boa).

Imagino usar o re-render/re-number com bastante frequência ao criar notebooks, então eu votaria em um botão da barra de ferramentas ou, se ele entrar no menu, pelo menos em uma tecla de atalho de modo normal.

@lucasb-eyer Acho que é uma boa coisa a se fazer para uma extensão como @juhasch forneceu, mas provavelmente não faríamos isso por padrão, já que os atalhos de teclado padrão e o espaço da barra de ferramentas são extremamente preciosos. Mas seria possível adicionar um ou ambos via custom.js ou nbextension.

@minrk : As extensões podem ser facilmente ativadas/desativadas e re-renderizadas ligando/desligando usando a extensão de servidor nbextensions:
clipboard01

Se você pressionar obutton botão da barra de ferramentas, a numeração da equação é redefinida/re-renderizada.

@juhasch obrigado pelo seu trabalho! Este é um grande passo em frente.

@minrk em sua experiência, o que você proporia como a solução adequada de longo prazo para a numeração da equação? A extensão do @juhasch é apenas uma solução alternativa por enquanto. Não estou pedindo que você implemente, apenas descreva qual deve ser a solução. Acho que há muitas pessoas realmente incomodadas com isso, e se soubermos qual é o caminho certo a seguir, podemos tentar tentar.

o que você proporia como a solução adequada de longo prazo para a numeração da equação?

Você não pode tê-lo. O MathJax assume que tem acesso à página inteira quando executa a numeração de equações, e o IPython renderiza o Markdown célula a célula, que é a única maneira sensata de fazer isso para notebooks grandes. Isso exigiria trabalho/implementação no lado do MathJax, não no notebook.

A maioria das pessoas (inclusive eu) só quer numeração de equações. Eu não acho que nos importamos muito como isso é tecnicamente implementado. Assim, posso ver vários caminhos possíveis, por exemplo, adicionar alguns patches ao MathJax que permitem que o notebook informe o número da equação sem ter acesso à página inteira, ou outra solução é apenas usar o MathJax para renderizar a equação sem o número , e depois renderize o número pelo próprio notebook. Pode haver mais opções. Mas eu gostaria de ter alguma bênção oficial sobre qual caminho é o melhor, já que não sou bem versado nos internos.

o que você proporia como a solução adequada de longo prazo para a numeração da equação?

Por enquanto, eu basicamente faria o que @juhasch fez com sua extensão, com as seguintes alterações se mescladas no master:

  1. desativá-lo por padrão
  2. store toggle no frontend-config, então você só precisa ativá-lo uma vez
  3. adicionar ação de renumeração, para que possa ser vinculado a um atalho de teclado
  4. coloque a interface do usuário padrão para renumeração no menu em vez da barra de ferramentas

Basicamente, eu faria um pouco pior do que a extensão para aqueles para quem isso é uma prioridade, já que isso não faz sentido como padrão. Uma vez que a ação está disponível, no entanto, adicionar coisas como atalhos e botões da barra de ferramentas se torna uma personalização simples para quem tem prioridades diferentes.

Não sei quão viável é a numeração sempre correta, porque isso significaria que em _qualquer_ renderização de uma célula de remarcação ou saída HTML, a numeração precisaria ser redefinida e _todas_ as células de remarcação e saídas HTML precisariam ser renderizadas novamente, cada vez.

Dada a documentação, isso parece um plano razoável para mim como usuário. :+1:

@minrk : como usuário, eu também acharia isso uma solução útil. Quão oneroso seria renderizar novamente todas as saídas de markdown e HTML?

@gregnordin que vai depender do tamanho do notebook e crescer sem limites com o tamanho do notebook. Isso significaria que toda vez que você edita uma célula de remarcação, pode levar uma quantidade de tempo semelhante para carregar o bloco de anotações inteiro quando você o abre pela primeira vez. Definitivamente não é bom para um comportamento padrão, mas se uma extensão quisesse tentar tentar, eles seriam bem-vindos para tentar.

+1

+1 para este recurso. Estou preparando palestras sobre física para alunos e a numeração de equações é essencial.

Outra opção, que permite atualizar os números das equações, sem rerenderizar tudo, é um javascript que busca na saída HTML por elementos com equações ou referências e substitui seu texto pelo valor apropriado.

Para obter isso totalmente funcional, seriam necessárias algumas modificações no MathJax, definindo atributos adicionais para os elementos que precisam ser atualizados, para que o script possa reconhecê-los.

No momento, esse suporte não existe, mas as seguintes soluções alternativas farão o truque

  • use \tag{labelname} para criar um número de equação. Observe que aqui a tag é o rótulo
  • faça referência a ele no markdown com código html bruto <span class=reference data-target=labelname></span> Isso é necessário porque a saída HTML de \ref ou \eqref não inclui o nome do rótulo.

por exemplo

$$
\begin{equation}
  A = 1 \tag{eq:sample}
\end{equation}
$$

The amazing result in <span class=reference data-target="eq:sample"></span> can ...blah..blah

O script a seguir atualiza os números das equações. Ele precisa ser executado após a renderização de novos números de equação ou referências. Por enquanto você pode colocar o script em uma célula separada e executá-lo manualmente quando necessário. Uma solução completa precisa de algum mecanismo para acionar uma reexecução em momentos apropriados.

%%javascript

// find all equation numbers (tags) that have no data-label attribute and set
// it to the tag text
$("span.mtd[id|='mjx-eqn']").not("[data-label]").each(
    function (index)
    {
        $(this).attr("data-label", $(this).text().slice(1,-1));
    }
);

// loop over all equation numbers and set the text 
$("span.mtd[id|='mjx-eqn']").each(
    function (index)
    {
        $(this).text("(" + (index+1) + ")");
    }
);

// loop over all references and resolve them by finding the
// equation number with a matching data-label attribute
$("span.reference").each(
    function (index)
    {
        var target = $(this).attr("data-target");
        var eqn = $("span.mtd[id|='mjx-eqn'][data-label='" + target + "']").text()
        $(this).text(eqn)
    }
);

Observe que o script atualiza apenas os números, deixando todo o layout como está. Deve ser muito mais eficiente do que deixar o MathJax renderizar tudo novamente.

@basvandertol Obrigado pela amostra, mas não vejo como isso é útil, pois os resultados são visíveis apenas na tela atual: eles não são salvos, não podem ser impressos, não podem ser visualizados no nbviewer nem vistos em qualquer saída (PDF, HTML, etc.) não vejo que isso seja uma solução alternativa. Eu não entendi você? Ou isso é apenas parte de uma solução?

Obrigado pelo feedback @dsblank. Na verdade, é apenas uma solução parcial, especificamente para o problema de atualizar os números das equações durante a edição do notebook sem renderizar tudo novamente. Eu estava experimentando com atributos de dados HTML para conseguir isso. Mais tarde, descobri que o nbconvert usa uma abordagem semelhante para lidar com citações de látex. http://nbconvert.readthedocs.io/en/latest/latex_citations.html

No momento, o MathJax não adiciona atributos suficientes à saída HTML para resolver as referências após a renderização. É por isso que uso esses rótulos e referências hackish para obter a saída HTML de que preciso. Com esses rótulos, a conversão normal para Latex ->pdf é interrompida.

Agora estou me familiarizando com o código fonte do MathJax para ver se existe alguma maneira fácil de adicionar os atributos HTML aos rótulos e referências normais.

O próximo passo seria adicionar suporte no nbconvert para reconhecer esses atributos HTML, assim como já faz com citações. Se nbconvert também puder varrer a saída de seções de código para HTML com esses atributos, uma legenda/rótulo HTML poderá ser adicionada às figuras geradas por código e nbconvert
pode gerar a saída de látex correta. As figuras podem então ser referenciadas em células de marcação.

É apenas um esboço de uma abordagem para suporte completo para referências em notebooks ipython. Parece viável para mim, mas se alguém já vê um showhopper agora, por favor me avise. Eu sei muito pouco sobre o interior do notebook ipython. Este parece ser um projeto divertido para aprender mais, mas no momento não posso supervisionar todas as implicações.

Acabei de encontrar este tópico (longo) ...

Pode ser que isso possa ser interessante: tentei algo para suportar a renderização de ambientes LaTeX, incluindo _numeração e atualização automáticas_ de equações e ambientes, em todo o documento.
Ele usava um botão para atualizar, mas agora usa uma ideia semelhante à mencionada por @basvandertol acima.

Claro que tudo isso adiciona alguma sobrecarga, mas isso é amplamente aceitável para mim, mesmo para documentos bastante longos. Exportação de notebook para documentos html e LaTeX está disponível;

Você pode dar uma olhada na extensão aqui ou no Pypi . Melhor.

+1 para integrar alguma versão das soluções propostas no master.

isso já está resolvido ou devo +1 isso?

Esta página foi útil?
0 / 5 - 0 avaliações