วิธีรับ Rainbow-delimiters / rainbow-block เพื่อไฮไลต์คณิตศาสตร์ในบรรทัดในสมการ LaTeX


12

ฉันใช้สเปซแมคกับ AUCTeX สำหรับการแก้ไข LaTeX และต้องการสร้างตัวคั่นแบบสายรุ้งและ / หรือบล็อกสีรุ้งให้เน้นสมการคณิตศาสตร์ LaTeX น่าเสียดายที่นี่ใช้งานได้เพียงบางส่วนนั่นคือสมการบางส่วนจะถูกเน้นสี

ตัวอย่าง: rainbow-delimiters

ในสกรีนช็อตตัวอย่างคณิตศาสตร์ในบรรทัด$จะไม่ถูกเน้นในขณะที่ส่วนที่เหลือรวมถึงคณิตศาสตร์ในบรรทัดที่อยู่ใน\(...\)นั้น

เมื่อrainbow-blocksมันแย่ลงบางครั้งมันจะทำงานในที่เดียวของเอกสารและบางครั้งจะไม่ทำงานโดยไม่คำนึงถึงขอบเขต

ตัวอย่าง: บล็อกสายรุ้ง

ถาม: มีใครรู้บ้างไหมว่าทำไมสิ่งนี้ถึงเกิดขึ้นหรือจะrainbow-blocksทำงานกับคณิตศาสตร์ในสายงานใน LaTeX ได้หรือไม่? มีทางเลือกอื่น ๆ ในการทำงานหรือไม่?


Latex-mode ใน auctex ดูเหมือนว่าจะกำหนด "$" ให้มีไวยากรณ์พิเศษใน syntax-table ดังนั้นบางทีการทำแบบอักษรของ syntactic ของ font-lock นั้นอาจจะมาจากการใช้แบบอักษรของคีย์เวิร์ด
คิริลล์

highlight-parenthesesใช้การวางซ้อนแทนการล็อคแบบอักษรและมันจะเป็นเรื่องง่ายมากที่จะใช้ตารางไวยากรณ์ชั่วคราวสำหรับช่วงเวลาของฟังก์ชั่นการซ้อนทับ github.com/nschum/highlight-parentheses.el ฟังก์ชั่นที่จะต้องเปลี่ยนในไลบรารีนั้นคือhl-paren-highlight: (let ((my-syntax-table (make-syntax-table))) (with-syntax-table my-syntax-table . . . น่าเสียดายที่เป็นอีกไลบรารีที่คุณระบุไว้ - ฉันไม่รู้ว่าจะแก้ไขอย่างไรrainbow-delimiters- บางทีคุณอาจจะ เปิดปัญหา Github กับผู้ดูแล
ฏหมาย

การใช้(with-silent-modifications (remove-text-properties (region-beginning) (region-end) '(face nil font-lock-face nil)) (add-text-properties (region-beginning) (region-end) '(face rainbow-delimiters-depth-1-face)))มันเป็นไปได้ที่จะเปลี่ยนแบบอักษรภายในสูตรฝังตัว rainbow-delimiters-propertize-delimiterแต่นี้ไม่ได้ทำงานในรอบคำแนะนำของ นี้บ่งชี้ว่า fontification ของlatex-modeเกิดขึ้นหลังจาก fontification rainbow-delimiters-modeผ่าน
Tobias

Rainbow-delimiters ใช้ jit-lock โดยตรง บางทีการสร้างแบบอักษรวากยสัมพันธ์ไม่ได้ใช้ jit-lock และเราเจอปัญหาเรื่องเวลาเพราะสิ่งนั้น?
Tobias

คำตอบ:


2

ต่อไปนี้เป็นเหมือนความคิดเห็นตั้งแต่

  1. มันแก้ไขได้เพียงส่วนเล็ก ๆ ของปัญหา ( rainbow-delimiters-mode)
  2. มันไม่ได้ทดสอบอย่างละเอียด (เพียงแค่มีไฟล์ลาเท็กซ์หนึ่งไฟล์)
  3. ฉันไม่เข้าใจว่าทำไมมันถึงทำงานfont-lock-modeได้จริง ๆ( เป็นเครื่องจักรที่ซับซ้อนจริงๆ)

ตอนแรกทางออกสำหรับrainbow-delimiters-mode:

เราเปลี่ยนคุณสมบัติข้อความfont-lock-faceจากfaceในและrainbow-delimiters-propertize-delimiter rainbow-delimiters-unpropertize-delimiterเนื่องจากdefsubstใช้ในแพ็คเกจแทนdefunเราไม่สามารถใช้งานได้defaliasแต่ต้องแก้ไขฟังก์ชั่นของตัวเอง (เท่าที่ฉันเข้าใจ - โปรดแสดงความคิดเห็นหากฉันผิดในเรื่องนี้)

ฟังก์ชั่นการแก้ไขคือ:

(defsubst rainbow-delimiters-propertize-delimiter (loc depth)
  "Highlight a single delimiter at LOC according to DEPTH.

LOC is the location of the character to add text properties to.
DEPTH is the nested depth at LOC, which determines the face to use.

Sets text properties:
`font-lock-face' to the appropriate delimiter face.
`rear-nonsticky' to prevent color from bleeding into subsequent characters typed by the user."
  (with-silent-modifications
    (let ((delim-face (if (<= depth 0)
                          'rainbow-delimiters-unmatched-face
                        (rainbow-delimiters-depth-face depth))))
      ;; (when (eq depth -1) (message "Unmatched delimiter at char %s." loc))
      (add-text-properties loc (1+ loc)
               ;; 2015-05-24: Changed font-lock-face to face to enable rainbow after syntax fontification in latex-mode
               ;; (see http://emacs.stackexchange.com/questions/4260/how-to-get-rainbow-delimiters-rainbow-blocks-to-highlight-in-line-math-in-latex)
                           `(face ,delim-face
                             rear-nonsticky t)))))


(defsubst rainbow-delimiters-unpropertize-delimiter (loc)
  "Remove text properties set by rainbow-delimiters mode from char at LOC."
  (with-silent-modifications
    (remove-text-properties loc (1+ loc)
                ;; 2015-05-24: See corresponding line in `rainbow-delimiters-propertize-delimiter'.
                            '(face nil
                              rear-nonsticky nil))))

ตอนนี้เหตุผล:

สูตรฝังตัวระหว่าง $ -delimiters เป็นไวยากรณ์แบบอักษรโดยแบบอักษร - ล็อค - โหมด (ตามที่คิริลล์ชี้ไปแล้ว) การลงทะเบียนของแบบอักษรนี้ดูเป็นปกติ (ดูตัวแปรfont-lock-syntactic-face-functionและฟังก์ชั่นfont-latex-syntactic-face-function) แต่describe-charที่ตัวละครของฝังตัวแสดงให้เห็นว่าสูตรที่ fontification ประโยคใช้face-property แทนfont-lock-face-property

ต่อไปนี้เป็นข้อสันนิษฐานเนื่องจากฉันไม่เข้าใจอย่างสมบูรณ์เกี่ยวกับเครื่องจักรตัวล็อคแบบอักษรซึ่งค่อนข้างซับซ้อน

มันดูเหมือนว่าจะแข็งแกร่งกว่าface font-lock-faceRainbow-delimiters ใช้font-lock-faceซึ่งถูกครอบงำด้วยfaceการสร้างแบบอักษรวากยสัมพันธ์ อย่างไรก็ตามเรามีข้อได้เปรียบที่การทำให้แบบอักษรเป็นประโยคมาก่อนการค้นหาแบบอักษร (คำหลัก) ตามแบบอักษรซึ่งจะใช้ jit-lock (ดูหน้าข้อมูลของfont-lock-mode)

นำไปสู่การที่ผมสรุปว่าปัญหาจะแก้ไขถ้าเราใช้faceในการแทนrainbow-delimiters font-lock-faceและที่นี่ฉันไม่รู้ผลลัพธ์ที่สมบูรณ์ แต่เนื่องจากrainbow-delimitersใช้jit-lockโดยตรง (และไม่ผ่านfont-lock-mode) เรากำลังยืนอยู่บนพื้นที่สั่นคลอนอยู่ดี

หมายเหตุที่ฉันมีอยู่แล้วติดต่อกับบางคนrainbow-delimiters(ดู/programming/19800243/highlight-first-mismatching-paren/20022030#20022030 ) rainbow-blocksแต่ไม่ได้มี เพราะฉันมีเพียงกรอบ จำกัด rainbow-delimitersของเวลาที่ฉันเลือกที่จะมีสมาธิในการ บางทีคุณสามารถแก้ปัญหาrainbow-blocks-problem ในวิธีที่คล้ายกันได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.