2013-01-06 29 views
6

Tôi đang cố định cấu hình trình soạn thảo TeXWorks để sử dụng cùng màu cú pháp như TeXMaker. Tuy nhiên, TexWorks sử dụng regexes để xác định những gì nên được tô màu. Thật không may nó không có một thiết lập mặc định cho toán học.Regex để phù hợp với phương trình LaTeX

Tôi muốn để phù hợp với tất cả mọi thứ giữa $$, tất cả mọi thứ giữa \[\], tất cả mọi thứ giữa \(\), tất cả mọi thứ giữa $$$$. Sau này không cần thiết vì nó hiếm khi được sử dụng trong các tài liệu LaTeX.

Nó cũng có thể có nhiều hơn một regex để phù hợp với tất cả các trường hợp.

Tất nhiên \$ được thoát vì vậy tôi không muốn để phù hợp với, cũng không \\[, vv

Sau đó, tôi cũng muốn để phù hợp với tất cả mọi thứ giữa \begin{equation}\end{equation}, nhưng đó là đơn giản.

'Không thể thực hiện được' là câu trả lời có thể xảy ra.

+0

Tại sao câu trả lời và nhận xét biến mất khi chỉnh sửa câu hỏi? – marczellm

+1

Oli đã xóa câu trả lời của mình để phản hồi lại những lời chỉ trích của bạn để nó không còn nữa. Một từ trên bình luận của bạn ở đó, mặc dù: '\ (… \)' * có thể * được lồng nhau (xem xét '\ (x = y + z \ text {trong đó \ (z \) là lỗi} \)' là hoàn toàn có hiệu lực). Đó là một trong những lý do để thích nó hơn ủng hộ '$… $'. Tuy nhiên, bạn có thể muốn bỏ qua điều đó vì mục đích đơn giản. –

+0

@KonradRudolph Yep, điều đó không quan trọng. – marczellm

Trả lời

6

Hãy thử regex này PCRE:

(?<!\\) # negative look-behind to make sure start is not escaped 
(?:  # start non-capture group for all possible match starts 
    # group 1, match dollar signs only 
    # single or double dollar sign enforced by look-arounds 
    ((?<!\$)\${1,2}(?!\$))| 
    # group 2, match escaped parenthesis 
    (\\\()| 
    # group 3, match escaped bracket 
    (\\\[)|     
    # group 4, match begin equation 
    (\\begin\{equation\}) 
) 
# if group 1 was start 
(?(1) 
    # non greedy match everything in between 
    # group 1 matches do not support recursion 
    (.*?)(?<!\\) 
    # match ending double or single dollar signs 
    (?<!\$)\1(?!\$)| 
# else 
(?: 
    # greedily and recursively match everything in between 
    # groups 2, 3 and 4 support recursion 
    (.*(?R)?.*)(?<!\\) 
    (?: 
    # if group 2 was start, escaped parenthesis is end 
    (?(2)\\\)| 
    # if group 3 was start, escaped bracket is end 
    (?(3)\\\]|  
    # else group 4 was start, match end equation 
    \\end\{equation\} 
) 
)))) 

Xem regex này trong hành động: https://regex101.com/r/wP2aV6/25

Kể từ regex này sử dụng đệ quy nó sẽ xử lý biểu thức toán học lồng nhau một cách chính xác.

Điều này chỉ hoạt động trên các công cụ regex tương thích PCRE. Nó đòi hỏi một số tính năng tiên tiến của động cơ regex, như lookbehind tiêu cực, biểu thức điều kiện và đệ quy mà không có mặt trong tất cả các động cơ regex.

+0

Thật không may có vẻ như động cơ regex trong TeXWorks (có lẽ là QRegEx của Qt) không hỗ trợ một số tính năng bạn đã sử dụng. Trích dẫn: ["xác nhận lookbehind, subexpressions độc lập và biểu thức điều kiện không được hỗ trợ"] (http://doc.qt.digia.com/qt/qregexp.html) Tôi hiểu các tính năng này là cần thiết, vì vậy có vẻ như tôi ra ngoài của may mắn ở đây. Điều này không liên quan đến regex của bạn mà là chính xác anyway, vì vậy cảm ơn bạn cho công việc của bạn. TeXWorks nên chuyển sang một công cụ regex khác để hỗ trợ làm nổi bật toán học. – marczellm

+1

Có thể phát hiện những điều sau: Mở $ phải có ký tự ngay bên phải của nó, trong khi đóng $ phải có ký tự ngay bên trái của nó. Do đó, 20.000 đô la và 30.000 đô la sẽ không phân tích thành toán học. Vì vậy, chúng tôi có thể có $ 20 đô la và $ \ sum_ {i = 1}^{\ infty} $ – jmlopez

+0

bạn có nghĩa là một không gian thay vì một ký tự không? –

Các vấn đề liên quan