【问题标题】:in org-mode, how to fold/hide footnotes?在组织模式下,如何折叠/隐藏脚注?
【发布时间】:2013-03-06 21:06:31
【问题描述】:

在 Emacs 组织模式中,有没有办法让内联脚注定义显示为折叠?

例如,像这样的一行:

This effect is due to the strength of weak ties[fn:: Newman, Mark, Albert-László Barabási, and Duncan J. Watts. 2006. The Structure and Dynamics of Networks. Princeton, NJ: Princeton University Press].

可能看起来像这样:

This effect is due to the strength of weak ties[✭].

我还需要一个命令来在必要时显示脚注。所以可能需要两个命令:org-hide-footnotesorg-show-footnotes

【问题讨论】:

  • 我们能否将预期的结尾正则表达式 ]. 缩小到更明确的范围?例如,].[fn:: 之后的第一次出现——这意味着你不能在脚注内有第二对方括号。或者,也许我们可以说它将是第一个].,它位于一行的末尾,并且很难返回?是否可能有不止一行 - 例如,一个段落或更多,段落之间有空行?预期的解决方案考虑到此脚注将不会位于属性抽屉内,该抽屉会单独折叠。
  • 脚注可能不在行尾。但是脚注中永远不会有方括号。所以第一次出现] 表示脚注的结束。换句话说,让我们采纳您的第一个建议。

标签: emacs lisp elisp org-mode footnotes


【解决方案1】:

我认为目前这是不可能的。同样使用TAB 作为其中的扩展键可能会导致键的更多重载。

另一方面,有什么特别的理由不为脚注使用脚注部分吗?

C-c C-x f 将创建/与您拥有的任何脚注交互。

(org-footnote-action &optional SPECIAL)

为脚注做正确的事。

在脚注引用时,跳转到定义。

在定义时,如果存在参考,请跳转到参考,提供 否则创建它们。

当既不在定义也不引用时,创建一个新的脚注, 互动。

前缀为 arg SPECIAL,在菜单中提供额外的命令。

附加的命令是:

      s   Sort the footnote definitions by reference sequence.  During editing,
          Org makes no effort to sort footnote definitions into a particular
          sequence.  If you want them sorted, use this command, which will
          also move entries according to org-footnote-section.  Automatic
          sorting after each insertion/deletion can be configured using the
          variable org-footnote-auto-adjust.
      r   Renumber the simple fn:N footnotes.  Automatic renumbering
          after each insertion/deletion can be configured using the variable
          org-footnote-auto-adjust.
      S   Short for first r, then s action.
      n   Normalize the footnotes by collecting all definitions (including
          inline definitions) into a special section, and then numbering them
          in sequence.  The references will then also be numbers.  This is
          meant to be the final step before finishing a document (e.g., sending
          off an email).  The exporters do this automatically, and so could
          something like message-send-hook.
      d   Delete the footnote at point, and all definitions of and references
          to it.

【讨论】:

    【解决方案2】:

    INITIAL(2014 年 2 月 6 日):第一个工作草案。

    编辑 2014 年 2 月 18 日:修改了函数 lawlist-toggle-block-visibility,使其包含正确的 if/then/else 语句 - 即,如果该行包含必要的开始区域正则表达式,则块可见性将被切换,否则会出现一条消息说抱歉。 . . .为代码折叠添加了对相关线程的引用。修改了错误消息以引用点而不是线。

    下面答案的源代码也存储在Github上:https://github.com/lawlist/lawlist-org-block-toggle/blob/master/lawlist-org-block-toggle.el

    关于一个相关问题(即完全隐藏包含:PROPERTIES:字样的属性抽屉),请参考以下线程:Completely hide the :PROPERTIES: drawer in org-mode

    关于一个半相关的问题(即,创建一个自定义块以进行代码折叠),另请参阅:https://tex.stackexchange.com/a/161196/26911

    此解决方案已使用相当新的 Emacs Trunk 版本(构建于 2014 年 1 月 19 日)进行了测试,该版本包含 org-mode 版本 8.2.5c。由于 :PROPERTIES: 抽屉通过其 :END: 与脚注和 html 块分开折叠,因此该解决方案考虑脚注和/或 html 代码块将位于该属性抽屉内的任何位置.脚注可以出现在文本段落的任何位置,但不能在脚注内有另一对方括号——因为此代码查找第一个结束方括号以标记折叠区域的结束。这段代码认为#+BEGIN_HTML#+END_HTML 都将是flush-left 并带有左边距。启动视图仍然以相同的方式工作 - 例如,变量 org-startup-foldedorg-hide-block-startup

    org-cycle-internal-local 的修改为 org-mode 中的所有折叠形式启用标签循环。我们所做的只是修复函数​​的分页以使其更具可读性,并添加以下条件:((eq org-cycle-subtree-status 'subtree) (org-show-subtree) (message "ALL") (setq org-cycle-subtree-status 'all))。交互功能org-cycle 仍用于在所有各种折叠/展开视图之间进行选项卡循环。函数lawlist-block-org-cycle-internal-localorg-cycle 使用的非交互式 支持函数。此解决方案中代码的两个defalias 部分是一切正常工作所必需的。除了使用制表符循环,用户还可以直接在标题或子标题的开头调用交互功能:M-x org-cycle RET

    要直接切换脚注或 html 块的可见性,我们使用交互功能 lawlist-toggle-block-visibility。将光标放在包含脚注开始或html块开始的行的任意位置,然后输入:M-x lawlist-toggle-block-visibility RET

    (require 'org)
    
    (defalias 'org-cycle-hide-drawers 'lawlist-block-org-cycle-hide-drawers)
    
    (defun lawlist-block-org-cycle-hide-drawers (state)
      "Re-hide all drawers, footnotes or html blocks after a visibility state change."
      (when
        (and
          (derived-mode-p 'org-mode)
          (not (memq state '(overview folded contents))))
        (save-excursion
          (let* (
              (globalp (memq state '(contents all)))
              (beg (if globalp (point-min) (point)))
              (end
                (cond
                  (globalp
                    (point-max))
                  ((eq state 'children)
                    (save-excursion (outline-next-heading) (point)))
                  (t (org-end-of-subtree t)) )))
            (goto-char beg)
            (while
              (re-search-forward
                ".*\\[fn\\|^\\#\\+BEGIN_HTML.*$\\|^[ \t]*:PROPERTIES:[ \t]*$" end t)
              (lawlist-org-flag t))))))
    
    (defalias 'org-cycle-internal-local 'lawlist-block-org-cycle-internal-local)
    
    (defun lawlist-block-org-cycle-internal-local ()
      "Do the local cycling action."
      (let ((goal-column 0) eoh eol eos has-children children-skipped struct)
        (save-excursion
          (if (org-at-item-p)
            (progn
              (beginning-of-line)
              (setq struct (org-list-struct))
              (setq eoh (point-at-eol))
              (setq eos (org-list-get-item-end-before-blank (point) struct))
              (setq has-children (org-list-has-child-p (point) struct)))
            (org-back-to-heading)
            (setq eoh (save-excursion (outline-end-of-heading) (point)))
            (setq eos (save-excursion (1- (org-end-of-subtree t t))))
            (setq has-children
              (or
                (save-excursion
                  (let ((level (funcall outline-level)))
                    (outline-next-heading)
                    (and
                      (org-at-heading-p t)
                      (> (funcall outline-level) level))))
                (save-excursion
                  (org-list-search-forward (org-item-beginning-re) eos t)))))
          (beginning-of-line 2)
          (if (featurep 'xemacs)
            (while
                (and
                  (not (eobp))
                  (get-char-property (1- (point)) 'invisible))
              (beginning-of-line 2))
            (while
                (and
                  (not (eobp))
                  (get-char-property (1- (point)) 'invisible))
              (goto-char (next-single-char-property-change (point) 'invisible))
              (and
                (eolp)
                (beginning-of-line 2))))
          (setq eol (point)))
        (cond
          ((= eos eoh)
            (unless (org-before-first-heading-p)
              (run-hook-with-args 'org-pre-cycle-hook 'empty))
            (org-unlogged-message "EMPTY ENTRY")
            (setq org-cycle-subtree-status nil)
            (save-excursion
              (goto-char eos)
              (outline-next-heading)
              (if (outline-invisible-p)
                (org-flag-heading nil))))
          ((and
              (or
                (>= eol eos)
                (not (string-match "\\S-" (buffer-substring eol eos))))
              (or
                has-children
                (not (setq children-skipped
                  org-cycle-skip-children-state-if-no-children))))
            (unless (org-before-first-heading-p)
              (run-hook-with-args 'org-pre-cycle-hook 'children))
            (if (org-at-item-p)
              ;; then
              (org-list-set-item-visibility (point-at-bol) struct 'children)
              ;; else
              (org-show-entry)
              (org-with-limited-levels (show-children))
              (when (eq org-cycle-include-plain-lists 'integrate)
                (save-excursion
                  (org-back-to-heading)
                  (while (org-list-search-forward (org-item-beginning-re) eos t)
                    (beginning-of-line 1)
                    (let* (
                        (struct (org-list-struct))
                        (prevs (org-list-prevs-alist struct))
                        (end (org-list-get-bottom-point struct)))
                      (mapc (lambda (e) (org-list-set-item-visibility e struct 'folded))
                        (org-list-get-all-items (point) struct prevs))
                      (goto-char (if (< end eos) end eos)))))))
            (org-unlogged-message "CHILDREN")
            (save-excursion
              (goto-char eos)
              (outline-next-heading)
              (if (outline-invisible-p)
                (org-flag-heading nil)))
            (setq org-cycle-subtree-status 'children)
            (unless (org-before-first-heading-p)
              (run-hook-with-args 'org-cycle-hook 'children)))
          ((or
              children-skipped
              (and
                (eq last-command this-command)
                (eq org-cycle-subtree-status 'children)))
            (unless (org-before-first-heading-p)
              (run-hook-with-args 'org-pre-cycle-hook 'subtree))
            (outline-flag-region eoh eos nil)
            (org-unlogged-message
            (if children-skipped
              "SUBTREE (NO CHILDREN)"
              "SUBTREE"))
            (setq org-cycle-subtree-status 'subtree)
            (unless (org-before-first-heading-p)
              (run-hook-with-args 'org-cycle-hook 'subtree)))
          ((eq org-cycle-subtree-status 'subtree)
            (org-show-subtree)
            (message "ALL")
            (setq org-cycle-subtree-status 'all))
          (t
            (run-hook-with-args 'org-pre-cycle-hook 'folded)
            (outline-flag-region eoh eos t)
            (org-unlogged-message "FOLDED")
            (setq org-cycle-subtree-status 'folded)
            (unless (org-before-first-heading-p)
            (run-hook-with-args 'org-cycle-hook 'folded))))))
    
    (defun lawlist-org-flag (flag)
      "When FLAG is non-nil, hide any of the following:  html code block;
    footnote; or, the properties drawer.  Otherwise make it visible."
      (save-excursion
        (beginning-of-line 1)
        (cond
          ((looking-at ".*\\[fn")
            (let* (
              (begin (match-end 0))
              end-footnote)
              (if (re-search-forward "\\]"
                    (save-excursion (outline-next-heading) (point)) t)
                (progn
                  (setq end-footnote (point))
                  (outline-flag-region begin end-footnote flag))
                (user-error "Error beginning at point %s." begin))))
          ((looking-at "^\\#\\+BEGIN_HTML.*$\\|^[ \t]*:PROPERTIES:[ \t]*$")
            (let* ((begin (match-end 0)))
              (if (re-search-forward "^\\#\\+END_HTML.*$\\|^[ \t]*:END:"
                    (save-excursion (outline-next-heading) (point)) t)
                (outline-flag-region begin (point-at-eol) flag)
                (user-error "Error beginning at point %s." begin)))))))
    
    (defun lawlist-toggle-block-visibility ()
    "For this function to work, the cursor must be on the same line as the regexp."
    (interactive)
      (if
          (save-excursion
            (beginning-of-line 1)
              (looking-at
                ".*\\[fn\\|^\\#\\+BEGIN_HTML.*$\\|^[ \t]*:PROPERTIES:[ \t]*$"))
        (lawlist-org-flag (not (get-char-property (match-end 0) 'invisible)))
        (message "Sorry, you are not on a line containing the beginning regexp.")))
    

    【讨论】:

    • 这对我来说似乎不再适用(并且 github 链接已损坏)。特别是如果我在一行上有多个脚注,它会完全失败。从那以后你更新了吗?如果没有,我是否应该再次要求提供可见性以防其他人有?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 2012-09-08
    相关资源
    最近更新 更多