gpt4 book ai didi

html - 如何在 Emacs 的组织模式下在源 block 的 "#+ATTR_HTML"预览输出周围添加 "#+RESULTS"?

转载 作者:行者123 更新时间:2023-12-04 10:09:44 25 4
gpt4 key购买 nike

我在 org 中使用 plantuml,它工作正常。但是,我试图通过在#+RESULTS 输出标记之前自动添加一些HTML 标记来进行一些更改,这样可以获得漂亮的HTML 输出效果。

我的示例代码如下:

#+BEGIN_SRC plantuml :file test.png
@startuml

package "Some Group" {
HTTP - [First Component]
[Another Component]
}

node "Other Groups" {
FTP - [Second Component]
[First Component] --> FTP
}

cloud {
[Example 1]
}


database "MySql" {
folder "This is my folder" {
[Folder 3]
}
frame "Foo" {
[Frame 4]
}
}


[Another Component] --> [Example 1]
[Example 1] --> [Folder 3]
[Folder 3] --> [Frame 4]

@enduml
#+END_SRC

在 plantuml 的“C-c C-c”之后,您将在 plantuml 代码块下方获得以下输出:

#+RESULTS:
[[file:test.png]]

但是,我希望它自动附加上面的#+RESULT 标签如下,这将显示在 Emacs 中的 plantuml 源代码块下面:

#+ATTR_HTML: :width 80% 
#+ATTR_ORG: :width 80%
#+ATTR_HTML: :style background-color: white; border-radius: 8px; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
#+RESULTS:
[[file:test.png]]

然后,我可以通过“C-c C-e h o”将 org 文件输出为 HTML,并得到一个漂亮的 HTML。

我怎样才能做到?

谢谢!

最佳答案

标准技术是为源 block 命名:

#+NAME: foo
#+BEGIN_SRC plantuml :file test.png
@startuml
...
#+END_SRC

当您评估代码块时,它将生成一个 #+RESULTS: header ,如下所示:

#+RESULTS: foo
[[file:test.png]]

现在您可以在结果前添加您的#+ATTR_* 声明:

#+ATTR_HTML: :width 80% 
#+ATTR_ORG: :width
#+ATTR_HTML: :style background-color: white; border-radius: 8px; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
#+RESULTS: foo
[[file:test.png]]

重新运行代码块会将文件链接放在同一个位置,并保留 #+ATTR-* 内容。然后您可以导出并获得“漂亮的 HTML”!

编辑:上面的主要目的是避免如果 block NOT 命名则需要手动工作:您将不得不继续将属性声明移动到新生成的#+RESULTS : 每次重新评估源 block (并清理旧结果)后的部分。从我的 POV 来看,这是烦人的部分, block 的命名很好地处理了它。

然后添加属性声明就变成了我不太希望自动化的一次性任务,主要是因为属性对于不同的 block 来说必然是不同的,所以我对一个 block 所做的任何事情都必须完全改变为另一个:我宁愿手动完成一次性任务。

也就是说,您可以部分自动化属性插入,例如通过创建一个函数来执行插入并将其绑定(bind)到一个键:

(defun insert-attr-decls ()
(interactive)
(insert "#+ATTR_HTML: :width 80%\n")
(insert "#+ATTR_ORG: :width 80%\n")
(insert "#+ATTR_HTML: :style background-color: white; border-radius: 8px; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);\n"))

(define-key org-mode-map [f10] 'insert-attr-decls)

然后在第一次评估之后,将点放在生成的 #+RESULTS: foo 行之前,然后按 F10。从我的 POV 来看,这就是我要停下来的地方(如果我走了这么远)。

下一步将是搜索 插入的位置,然后调用上面的函数 - 像这样虽然我确信它可以改进:

(defun insert-attr-decls ()
(insert "#+ATTR_HTML: :width 80%\n")
(insert "#+ATTR_ORG: :width 80%\n")
(insert "#+ATTR_HTML: :style background-color: white; border-radius: 8px; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);\n"))

(defun insert-attr-decls-at (s)
(let ((case-fold-search t))
(if (search-forward s nil t)
(progn
(search-backward s nil t)
(insert-attr-decls)))))

(defun insert-attr-decls-at-results ()
(interactive)
(save-excursion
(insert-attr-decls-at "#+RESULTS:")))

(define-key org-mode-map [f10] 'insert-attr-decls-at-results)

这已经是复杂性的巨大飞跃,并且它可能包含错误:会发生什么,例如如果缓冲区中没有#+RESULTS: 字符串?我没有测试过。因此,如果其他人愿意花时间来制作一个“完美”的功能,那么是的,也许我会接受并使用它。但除非这将成为我的生计工作,否则我宁愿把时间花在其他地方:如果它确实被证明是一个时间沉没,你总是可以在以后自动化它。

下一步(我不会这样做)是让C-c C-c 评估 block 添加属性声明。您可以通过将 insert-attr-decls-at-results 添加到 org-babel-after-execute-hook 变量来实现:

(add-hook 'org-babel-after-execute-hook 'insert-attr-decls-at-results)

这里的麻烦在于,在每次 评估时,您都会添加一个属性声明 block :您真的必须重写插入函数以检查是否有一个属性声明 block 已经存在,如果是,什么也不做。这留作练习。

故事 AFAIAC 的寓意是:您可以自动化一切,但并非一切都值得自动化。

关于html - 如何在 Emacs 的组织模式下在源 block 的 "#+ATTR_HTML"预览输出周围添加 "#+RESULTS"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61390513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com