1つのバッファー内の複数の主要モード(例:pythonモードとLaTeXモード)


7

LaTeXパッケージのpythontexを使用して、latexを実行する場合に実行される(必要に応じて、latexファイルに出力される)latexドキュメントにpythonコードを挿入できます。ラテックスファイルの編集にはauctexを使用していますが、ラテックスドキュメント内のpythonコードの編集は、バッファがpythonモードではなくラテックスモードであるため、少々面倒です。 。

では、PythonモードとLatexモードを混在させるための合理的な方法はありますか?たとえば、ポイントがPythonコード内にある場合、バッファは自動的にPythonモードにジャンプしますか?機能させるために.emacsファイルに何を追加する必要がありますか?他のアイデアは?

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepackage{pythontex}

\begin{document}

\begin{pycode}
print('test1')
def f( ):
    print('test2')

f()
\end{pycode}   

\pyc{f()}
\end{document}

pythontexは、たとえば、pycodeまたはpyverbatim環境として、\pycまたは\pyコマンドとして、pythoncodeを含むことができる複数の環境とコマンドがあることに注意してください。


1
これはorg-modeソースブロック(TeXも生成します)で簡単に実行できるものですが、これによりLaTeXの上に間接層がさらに追加され、生成されるTeXコードに影響を与えることが難しくなる場合があります。
wvxvw 2016

2
ポリモードemacsパッケージはこれを行うことができます。おそらく新しいバックエンドを作成する必要がありますが、それは簡単なはずです。
2016

@Ista:ポリモードに関連する部分はどのように見えますか(mmm-modeに対するJeanPierreの回答のように)?
学生の

@student:私はpythontexを使用せず、この質問に答えるためだけに設定することに関心はありません。そのため、私ができる最善のことは、github.com / vspinu / polymode /
Ista

別の質問のコメントで短い議論があり、この質問はより一般的な見出しになるはずです。これにより、この質問の優れた受け入れられた回答にアクセスしやすくなります。
トビアス

回答:


9

MMM-mode(複数の主要モード)はまさにあなたが探しているもののようです。emacs wikiで言及されています。LaTeXとpythonを混合するサブモードクラスを定義し、pythonの部分がpycodeLaTeXタグで区切られていることを指定する必要があります。以下をinitファイルに追加することで実行できます:

(require 'mmm-auto)
(mmm-add-classes
 '((latex-python
    :submode python-mode
    :face mmm-default-submode-face
    :front "\\\\begin{pycode}\n"
    :back "\\\\end{pycode}\n")))

(setq mmm-global-mode 'maybe)
(mmm-add-mode-ext-class 'latex-mode nil 'latex-python)

:frontそして:back、キーワードを指定した正規表現の区切り文字のために。最後の2行は、メジャーモードがであるすべてのバッファで、デフォルトでクラスがアクティブになることmmm-modeを要求していlatex-pythonますlatex-mode

他のオプションについては、ドキュメントを参照してください(ファイル名に基づいて、またはファイル変数を使用して手動でアクティブ化します)。

複数の区切り文字のペアを指定するには、2つの方法があります。まず、いくつかのクラスをグループに参加させることができます。以下は、代わりの定義latex-pythonクラスを、我々は2つのクラスを含むグループとして定義latex-python-envsし、latex-python-cmds(自身が認識\pyc{…}して\py{…}LaTeXのコマンド)。

第二に、各クラスは、いくつかのいくつかの区切り文字のペアを指定することができる:クラスはlatex-python-envs以下の両方を認識するであろうpycodepyverbatimLaTeXのENVSを(~1:back最初の括弧のグループ内で一致した値を意味します:front)。

(mmm-add-group 'latex-python
 '((latex-python-envs
    :submode python-mode
    :face mmm-default-submode-face
    :front "\\\\begin{\\(pycode\\|pyverbatim\\)}\n"
    :back "\\\\end{~1}\n"
    :save-matches 1)

   (latex-python-cmds
    :submode python-mode
    :face mmm-default-submode-face
    :front "\\\\pyc?{"
    :back "}")))

区切り文字が認識されるようにするには、mmm-parse-bufferC-c % C-b)(またはmmm-parse-region、またはmmm-parse-blockポイントの周りの数行)を行う必要があります。LaTeX-insert-environmentC-c C-e)を介してLaTeX envsを挿入することに慣れている場合、MMMが挿入されたばかりのタグをすぐに認識するように、完了時に実行するようにアドバイスすると便利mmm-parse-blockです。

(advice-add 'LaTeX-insert-environment ':after 
    '(lambda (env) (mmm-parse-block 2)))

ありがとう。Pythonコードを含む可能性がある環境やコマンドを追加するにはどうすればよいです\pycか(例:またはpyverbatim)。pycode環境を挿入した場合にmmm-modeを自動的に検出する方法はありますか?
学生

TABが期待どおりに機能しないことに気づきました。例:\begin{pycode} + ENTER +次にforループを挿入します(例:for i in range(0,10):+ ENTER + print(i)+ ENTER +)\end{pycode}for行の後のENTERはこのステートメントをインデントしますprint(i)が、これは機能しませんか?
学生

@student MMMは、サブモードが有効になるように再解析して両方の区切り文字を確認するように要求される必要があります。更新された回答を参照してください。それでも問題が解決しない場合はお知らせください。
JeanPierre

追加ありがとうございます。インデントに関して、私はあなたのヒントを使ってもう一度テストし、記述された問題は修正されました。ただし、さらにインデントの問題があります。まず、pycode環境を挿入すると、latex-modeがそれを自動的に意図し、TABを明示的に使用してこれを修正する必要があります。別の環境でpycodeを使用すると、別の問題が発生します。私は私が何を意味するのかを明確にするためにスクリーンキャストを作成しました:expirebox.com/download/e348355feabb8bb5d8c8399b97bccdb8.html
学生

上記で提案した複数の環境を含める方法も、コマンド\pycと一致させたい場合に機能します\pyか?
学生の
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.