Làm cách nào tôi có thể viết [0,1) trong chế độ LaTeX mà không ngắt thụt lề?


9

Khi viết LaTeX bằng cách sử dụng latex-mode, tôi thường muốn viết "khoảng thời gian nửa mở" trong văn bản của mình. Ví dụ, [0,1)trong đó đề cập đến tập hợp tất cả các số xvới 0 <= x < 1.

Thật không may, các "dấu phân cách không cân bằng" này dường như gây nhầm lẫn cho trình phân tích cú pháp thụt lề, khiến văn bản sau bị thụt vào không thích hợp, thường trôi về bên phải.

Đây là một tài liệu ví dụ. Văn bản dưới đây là kết quả sau khi làm C-x h M-x indent-region. Hành vi đúng sẽ là có tất cả các đoạn được thụt vào bởi 0 khoảng trắng.

\documentclass{article}
\begin{document}

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam volutpat
at dui et mattis. Here is a half open interval $[0,1)$.  Proin
  fringilla lectus nec mi tincidunt aliquet. Vestibulum fermentum eu
  neque id egestas. Here is another $[1,2)$.  Nullam et lectus
    convallis, placerat neque non, vehicula nisi.  Fusce imperdiet
    dignissim ante, eget fringilla nisi.

    Integer fermentum nunc eget purus molestie commodo. Integer
    tristique tincidunt odio, vel rutrum diam commodo quis. Fusce a
    aliquet quam. Cras suscipit est et nisl sollicitudin
    iaculis. Aliquam erat volutpat. Phasellus sapien arcu, aliquet ut
    hendrerit in, lobortis nec ante.

\end{document}

Hiện tại tôi đang xử lý vấn đề này với một bản hack xấu xí: Tôi xác định một macro LaTeX mở rộng thành không có gì và viết các dấu phân cách "khớp" bên trong một lời gọi của macro này. Điều này được các indenter trở lại đồng bộ.

\documentclass{article}
\newcommand{\ugh}[1]{}
\begin{document}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam volutpat
at dui et mattis. Here is a half open interval $[0,1)$.  Proin
  fringilla lectus nec mi tincidunt aliquet. Vestibulum fermentum eu
  neque id egestas. \ugh{(]} Now on the next line we are back in sync.
Nullam et lectus convallis, placerat neque non, vehicula nisi.  Fusce
imperdiet dignissim ante, eget fringilla nisi.
\end{document}

Nhưng điều này thực sự khó chịu. Có một giải pháp tốt hơn?

Tôi đang sử dụng GNU Emacs 24.4.1.


3
Không trả lời câu hỏi của bạn, nhưng bạn đã xem xét thử AocateeX chưa? Nó không phải chịu một lỗi nhỏ này.
giordano

@giordano: Tôi đã xem nó. Hành vi mặc định của nó nặng hơn rất nhiều so với những gì tôi muốn. Tôi thích chỉnh sửa LaTeX như mã và tôi không thực sự muốn kết xuất trình soạn thảo theo kiểu WYSIWYG. Có lẽ bạn có thể tắt tất cả những thứ đó và có trải nghiệm soạn thảo văn bản, nhưng nó vẫn khiến AocateeX có vẻ như quá mức cần thiết.
Nate Eldredge

6
Những hành vi giống như WYSIWYG mà bạn đang đề cập đến? Chỉ các tính năng như vậy là chế độ xem trước và chế độ gập và không có tính năng nào trong số chúng được kích hoạt theo mặc định (thậm chí bạn không cần phải tải các gói tương ứng để sử dụng AocateeX). Sự khác biệt chính giữa chế độ AocateeX và vanilla * TeX là cơ chế tự động hoàn thành vượt trội hơn nhiều khi chèn macro và môi trường. Nếu bạn coi trọng tự động hoàn thành thì AocateeX là cách tốt nhất. Ngoài ra, trong AocateeX bạn luôn phải chỉnh sửa mã * TeX, không có khả năng nào khác, tôi không biết tại sao bạn lại có ấn tượng sai này.
giordano

Câu trả lời:


7

Không phải là giải pháp Emacs, nhưng mã LaTeX của tôi viết các khoảng như \halfopen{0}{1}, trong đó

\newcommand\halfopen[2]{\ensuremath{[#1,#2)}}

Công ước này đẩy vấn đề cân bằng đến một nơi không có khả năng gây ra vấn đề. Và nó có thể tìm kiếm được :-)


2
Bạn dùng để làm (0,1]gì?
Andrew Swann

@ andrew-swann Có lẽ \openhalfhehehe
Dox

@AndrewSwann\halfclosed
Norman Ramsey

2

Hàm thụt lề latex-indentcủa việc latex-modeđặt bảng cú pháp tex-latex-indent-syntax-tablevà các cuộc gọi latex-find-indentlần lượt gọi latex-backward-sexp-1.

Cú pháp của ?\(?\)được đặt thành "."viết tắt của "dấu câu". Vì vậy, nó không còn là một dấu phân cách.

Do đó, các biểu thức như [0,1)kết quả thành một scan-errortrong latex-backward-sexp-1đó dẫn đến hành vi bất ngờ.

Bạn có thể tránh điều này bằng cách thêm các mục sau vào tệp init của bạn:

(eval-after-load "tex-mode"
    '(progn (modify-syntax-entry ?\( "()" tex-latex-indent-syntax-table)
             (modify-syntax-entry ?\) ")(" tex-latex-indent-syntax-table)))

Nhưng, tôi không biết hậu quả tiêu cực của cài đặt này kể từ khi tôi sử dụng auctex. Vì vậy, mong đợi điều tồi tệ nhất ;-).

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.