Usando o pacote LaTeX pythontex I, é possível inserir o código python no documento de látex que é executado (e impresso no seu arquivo de látex, se desejar), se você executar o látex. Eu uso o auctex para editar arquivos de látex, no entanto, editar o código python dentro do documento de látex é um pouco doloroso, pois o buffer está no modo látex e não no modo python, portanto, não há ajuda para a indentação adequada do código python e nenhum destaque de sintaxe .
Existe alguma maneira razoável de misturar o modo python com o modo látex? Por exemplo, o buffer passa automaticamente para o modo python se o ponto estiver dentro de um código python cortado? O que tenho que adicionar ao meu arquivo .emacs para que ele funcione? Alguma outra ideia?
\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepackage{pythontex}
\begin{document}
\begin{pycode}
print('test1')
def f( ):
print('test2')
f()
\end{pycode}
\pyc{f()}
\end{document}
Note que pythontex
tem vários ambientes e comandos que podem conter pythoncode, por exemplo pycode
, ou pyverbatim
como ambientes ou \pyc
ou \py
como comandos.
fonte
org-mode
blocos de origem (também gera TeX), mas isso adiciona outra camada de indireção sobre o LaTeX e às vezes dificulta a afetação do código TeX que está sendo gerado.Respostas:
MMM-mode
(vários modos principais) parece exatamente o que você está procurando. É mencionado no wiki do emacs . Você precisa definir uma classe de submodo para combinar o LaTeX e o python, especificando que as partes do python são delimitadas pelaspycode
tags LaTeX. Adicionar o seguinte ao seu arquivo init deve fazê-lo:As palavras
:front
-:back
chave e especificam expressões regulares para delimitadores. As duas últimas linhas solicitam quemmm-mode
alatex-python
classe seja ativada por padrão em todos os buffers cujo modo principal élatex-mode
.Consulte a documentação para outras opções (ativando-a manualmente, com base no nome do arquivo ou com variáveis de arquivo).
Existem duas maneiras de especificar vários pares de delimitadores. Primeiro, várias classes podem ser ingressadas em um grupo . Abaixo, em vez de definir a
latex-python
classe, definimos como um grupo que contém as duas classeslatex-python-envs
elatex-python-cmds
(ele próprio reconhece os comandos\pyc{…}
e\py{…}
LaTeX).Segundo, cada classe pode especificar vários pares de delimitadores: a classe
latex-python-envs
abaixo reconhecerá os doispycode
e ospyverbatim
envs do LaTeX (~1
in:back
refere-se ao valor correspondente no primeiro grupo entre parênteses em:front
).Para que os delimitadores sejam reconhecidos, é necessário
mmm-parse-buffer
(C-c % C-b
) (oummm-parse-region
, oummm-parse-block
seja, algumas linhas ao redor do ponto). Se você está acostumado a inserir envs do LaTeX através deLaTeX-insert-environment
(C-c C-e
), pode ser conveniente aconselhá- lo a executarmmm-parse-block
quando terminar, para que o MMM reconheça imediatamente as tags inseridas recentemente:fonte
\pyc
oupyverbatim
). Existe uma maneira de fazer o modo mmm detectar automaticamente se eu inserir umpycode
ambiente?\begin{pycode}
+ ENTER + e insira umfor
loop, por exemplo,for i in range(0,10):
+ ENTER +print(i)
+ ENTER +\end{pycode}
. O ENTER após afor
linha recua essa instrução, mas issoprint(i)
não funciona para você?pycode
ambiente, o modo de látex o fará automaticamente e você precisará usar a TAB explicitamente para corrigir isso; outro problema ocorrerá se você usar o pycode em outro ambiente. Eu fiz um screencast para esclarecer o que quero dizer: expirebox.com/download/e348355feabb8bb5d8c8399b97bccdb8.html\pyc
e\py
?