2014-03-12 28 views
1

在LaTeX文檔中,我使用\num在生成* .pdf時自動爲段落編號。我正在嘗試編寫一個函數,它將使用疊加層在Emacs中顯示數字。如果我使用一個符號我toggle-num-block功能部分的工作原理如倒三角形(例如,"\u25be"),但確實工作時,我使用一個變量如n(這是一個數字,每個\num被發現的時間增量) 。任何關於如何做到這一點的指針將不勝感激。如何疊加文本

要測試我的功能,我正在使用\num右側的空格來放置疊加層。如果我使用(overlay-put (make-overlay beg end) 'display "\u25be"))而不是(overlay-put (make-overlay beg end) 'display n)),則可以看到倒置的三角形。相反,倒三角形的,但是,我更願意有一個數字是逐步增加 - 1,2,3,等

我的文件看起來是這樣的:

\num Every good boy deserves fudge. 

\num I'm not a fig . . . . 

我想功能toggle-num-block能夠切換從上述例子來回下面的例子:

1.  Every good boy deserves fudge. 

2.  I'm not a fig . . . . 

這裏是我的草稿:

(require 'outline) 

(defun toggle-num-block() 
"When FLAG is non-nil, hide the region. Otherwise make it visible." 
(interactive) 
    (let ((n 0)) 
    (save-excursion 
     (goto-char (point-min)) 
     (while (re-search-forward "\\\\num" nil t) 
     (setq n (1+ n)) 
     (let* (
      (flag (not (get-char-property (match-end 0) 'invisible))) 
      (beg (match-end 0)) 
      (end (+ (match-end 0) 1))) 
      (outline-flag-region beg end flag) 
      (cond 
      (flag 
       (overlay-put (make-overlay beg end) 'display n)) ;; "\u25be" 
      (t 
       (mapc 'delete-overlay (overlays-in beg end))))))))) 

基於@Tyler以下(非常感謝)的有用的答案,這裏是修改後的功能,現在按預期工作:

(require 'outline) 

(defun toggle-num-block() 
"When FLAG is non-nil, hide the region. Otherwise make it visible." 
(interactive) 
    (let ((n 0)) 
    (save-excursion 
     (goto-char (point-min)) 
     (re-search-forward "\\\\begin\{document\}" nil t) 
     (while (re-search-forward "\\\\num" nil t) 
     (setq n (1+ n)) 
     (let* ((flag (not (get-char-property (match-beginning 0) 'invisible))) 
       (beg (match-beginning 0)) 
       (end (match-end 0))) 
      (outline-flag-region beg end flag) 
      (cond 
      (flag 
       (overlay-put 
       (make-overlay beg end) 
        'display 
        (concat (number-to-string n) "."))) 
      (t 
      (mapc 'delete-overlay (overlays-in beg end))))))))) 
+0

符號的函數定義是void:outline-flag-region。你能給我們一個完整的MWE嗎? – Tyler

+0

@Tyler - '(需要'提綱]'。對不起,我沒有想到 - 這是我每次Emacs啓動時加載的庫之一。我會更新這個問題。 – lawlist

回答

2

你有兩個問題 - 你設置begmatch-end代替match-beginning。並且您需要將n轉換爲字符串:

(require 'outline) 
(defun toggle-num-block() 
"When FLAG is non-nil, hide the region. Otherwise make it visible." 
(interactive) 
    (let ((n 0)) 
    (save-excursion 
     (goto-char (point-min)) 
     (while (re-search-forward "\\\\num" nil t) 
     (setq n (1+ n)) 
     (let* ((flag (not (get-char-property (match-end 0) 'invisible))) 
       (beg (match-beginning 0)) 
       (end (+ (match-end 0) 1))) 
      (outline-flag-region beg end flag) 
      (cond 
      (flag 
       (overlay-put (make-overlay beg end) 
          'display (concat (number-to-string n) ". "))) 
      (t 
      (mapc 'delete-overlay (overlays-in beg end))))))))) 
+0

非常感謝您解決我的功能故障 - 非常感謝! :) – lawlist

+0

沒問題。我一直在想如何疊加工作,這給了我一個找出答案的藉口!我更新了我的答案以添加'。'在...之後 – Tyler

+0

我對代碼做了一些小的改進(附加到問題中),以更好地處理拾取「不可見」字符屬性 - 即'(match-beginning 0)'似乎比'(match-結束0)'。我從'org-mode'中借用了一部分代碼,它在*開始的regexp(在本例中爲'\ num')之後將區域*摺疊起來,在這種情況下,正則表達式的結尾實際上是摺疊區域 - 在當前的例子中情況相反。我也將'end'減少爲'(match-end 0)',而我只是連接'「。」'而不是'「。」' – lawlist