Nhiều chế độ chính trong một bộ đệm (ví dụ: chế độ python & chế độ LaTeX)


7

Sử dụng pythontex gói LaTeX tôi có thể chèn mã python vào tài liệu latex được thực thi (và được in vào tệp latex của bạn nếu bạn muốn) nếu bạn chạy latex. Tôi sử dụng auctex để chỉnh sửa các tệp latex, tuy nhiên việc chỉnh sửa mã python bên trong tài liệu latex hơi khó khăn vì bộ đệm ở chế độ latex và không ở chế độ python, vì vậy không có sự trợ giúp nào để thụt lề mã python đúng cách và không làm nổi bật cú pháp .

Vậy có cách nào hợp lý để trộn chế độ python với chế độ latex không? Ví dụ, bộ đệm tự động nhảy sang chế độ python nếu điểm nằm trong mã python bị cắt? Tôi phải thêm gì vào tệp .emacs của mình để làm cho nó hoạt động? Còn ý tưởng nào khác không?

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

\begin{document}

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

f()
\end{pycode}   

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

Lưu ý rằng pythontexcó nhiều môi trường và lệnh có thể chứa pythoncode, ví dụ pycodehoặc pyverbatimdưới dạng môi trường hoặc \pychoặc \pydưới dạng lệnh.


1
Đây là điều dễ thực hiện với org-modecác khối nguồn (nó cũng tạo TeX), nhưng điều này lại thêm một lớp cảm ứng khác trên đỉnh LaTeX, và đôi khi gây khó khăn cho việc ảnh hưởng đến mã TeX được tạo.
wvxvw 7/2/2016

2
Gói polymode emacs có thể làm điều này. Bạn có thể phải viết một phụ trợ mới, nhưng điều đó được cho là dễ dàng.
Ista

@Ista: Các phần có liên quan cho polymode trông như thế nào (giống như trong câu trả lời của JeanPierre cho chế độ mmm)?
sinh viên

@student: Tôi không sử dụng pythontex và tôi không có hứng thú với việc thiết lập nó chỉ để trả lời câu hỏi này, vì vậy điều tốt nhất tôi có thể làm là hướng dẫn bạn đến tài liệu polymode tại github.com/vspinu/polymode/ cây / chủ / từ
Ista

Đã có một cuộc thảo luận ngắn trong các bình luận của một câu hỏi khác với kết quả là câu hỏi này sẽ có một tiêu đề tổng quát hơn. Điều đó làm cho câu trả lời được chấp nhận tuyệt vời của câu hỏi này dễ tiếp cận hơn.
Tobias

Câu trả lời:


9

MMM-mode(nhiều chế độ chính) dường như chính xác những gì bạn đang tìm kiếm. Nó được đề cập trên wiki emacs . Bạn cần xác định một lớp mã hóa để trộn LaTeX và python, chỉ định rằng các phần python được phân định bởi các pycodethẻ LaTeX. Thêm phần sau vào tệp init của bạn sẽ làm điều đó:

(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)

Các từ khóa :front:backxác định các biểu thức chính quy cho các dấu phân cách. Hai dòng cuối cùng yêu cầu mmm-modevới các latex-pythonlớp được kích hoạt theo mặc định trong tất cả các bộ đệm có chế độ chính là latex-mode.

Xem tài liệu cho các tùy chọn khác (kích hoạt thủ công, dựa trên tên tệp hoặc với các biến tệp).

Có hai cách để xác định một số cặp dấu phân cách. Đầu tiên, một số lớp có thể được tham gia trong một nhóm . Dưới đây, thay vì định nghĩa latex-pythonlớp chúng ta định nghĩa nó là một nhóm có chứa hai lớp latex-python-envslatex-python-cmds(chính nó nhận ra các lệnh \pyc{…}\py{…}LaTeX).

Thứ hai, mỗi lớp có thể chỉ định một vài một vài cặp delimiter: lớp latex-python-envsbên dưới sẽ nhận ra cả hai pycodepyverbatimLaTeX envs ( ~1trong :backđề cập đến giá trị khớp lệnh trong nhóm ngoặc đầu tiên trong :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 "}")))

Để các dấu phân cách được nhận ra, bạn cần mmm-parse-buffer( C-c % C-b) (hoặc mmm-parse-region, hoặc mmm-parse-blockmột vài dòng xung quanh điểm). Nếu bạn được sử dụng để chèn LaTeX envs thông qua LaTeX-insert-environment( C-c C-e), có thể thuận tiện để khuyên nó chạy mmm-parse-blockkhi hoàn thành, để MMM nhận ra ngay các thẻ vừa chèn:

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

Cảm ơn. Làm cách nào tôi có thể thêm các môi trường và lệnh khác có thể chứa mã python (ví dụ \pychoặc pyverbatim). Có cách nào để tự động phát hiện chế độ mmm nếu tôi chèn pycodemôi trường không?
sinh viên

Tôi chỉ nhận ra rằng TAB không hoạt động như mong đợi. Ví dụ: \begin{pycode} + ENTER + sau đó chèn một forvòng lặp, ví dụ for i in range(0,10):+ ENTER + print(i)+ ENTER + \end{pycode}. ENTER sau khi fordòng thụt lề tuyên bố này nhưng không print(i)làm việc này cho bạn?
sinh viên

MMM @student cần được yêu cầu lặp lại và xem cả hai dấu phân cách để mã con có hiệu lực, xem câu trả lời cập nhật. Hãy cho tôi biết nếu bạn vẫn gặp rắc rối.
JeanPierre

Cảm ơn đã bổ sung. Về vết lõm tôi đã kiểm tra lại bằng cách sử dụng gợi ý của bạn và vấn đề được mô tả đã được khắc phục. Tuy nhiên, có những vấn đề thụt lề xa hơn: Đầu tiên nếu bạn chèn một pycodemôi trường, chế độ latex sẽ tự động sử dụng nó và bạn phải sử dụng TAB một cách rõ ràng để khắc phục điều này, một vấn đề khác xảy ra, nếu bạn sử dụng pycode bên trong một môi trường khác. Tôi đã thực hiện một screencast để làm rõ ý của tôi: expirebox.com/doad/e348355fablesb8bb5d8c8399b97bccdb8.html
sinh viên

Phương thức bạn đề xuất ở trên để bao gồm nhiều môi trường cũng hoạt động nếu bạn muốn khớp với các lệnh \pyc\py?
sinh viên
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.