org模式下导出的html文件中语法突出显示和源代码块的缩进


9

当我在组织模式文件中插入C代码块时,将根据需要自定义语法高亮和源代码的缩进。

  1. 当我将其导出到html文件时,html文件中的语法高亮与Emacs中的语法完全相同。但是语法突出显示与我的Emacs的颜色主题配合使用效果更好。例如,{在我的C代码块中,符号为白色,但我的颜色主题为深色,如果我将其导出为html,则html文件的背景也为白色,这意味着您无法{在源代码块中看到导出的html甚至认为它在那里。

  2. 在我的Emacs中,源代码的缩进是正常的(按我的自定义方式),但是导出的html文件中源代码的缩进将有所不同,它为缩进添加了更多空间

  3. 如果我在中导出相同的组织文件emacs -q,则它们在导出的html文件中是正常的,但是语法高亮和源代码的缩进将是defaultEmacs 的配置。因此,这意味着中的字体配置init.el会影响org-export

所以我的问题是:当我将包含源代码块的组织模式文件导出到html文件(或其他格式,例如PDF)时,是否有可能摆脱我自己关于字体的所有配置源代码,是否像在emacs -q

更新

通过(setq org-src-preserve-indentation t)在init文件中进行设置或通过M-:eval-expression)运行它可以解决第二个问题。

Update2

第一个问题是通过根据theme设置组织导出的<code>块的背景来解决的。

如果解决了第一个和第二个问题,第三个问题并不重要。

Answers:


10

解决方案涵盖了elisp,org-mode和CSS定制。

elisp

默认情况下,字体信息嵌入在导出的html文件中。我们需要禁用它,并告诉org-mode我们计划使用外部CSS文件指定字体格式信息。

我选择用org-字符串为html类名称添加前缀。

;; (setq org-html-htmlize-output-type 'inline-css) ;; default
(setq org-html-htmlize-output-type 'css)
;; (setq org-html-htmlize-font-prefix "") ;; default
(setq org-html-htmlize-font-prefix "org-")

组织模式

然后,在组织文件中,指定要使用的CSS文件。该文件将包含有关如何格式化每个org-类的信息。

# My custom fontification theme
#+HTML_HEAD: <link href="path/to/your/custom/theme.css" rel="stylesheet">

的CSS

这是我的自定义主题css文件,在其中复制了的颜色代码leuven-theme。您可以从我的git中找到以下CSS的最新版本

/* Set the colors in <pre> blocks from the Leuven theme */
pre                                      {background-color:#FFFFFF;}
pre span.org-builtin                     {color:#006FE0;font-weight:bold;}
pre span.org-string                      {color:#008000;}
pre span.org-keyword                     {color:#0000FF;}
pre span.org-variable-name               {color:#BA36A5;}
pre span.org-function-name               {color:#006699;}
pre span.org-type                        {color:#6434A3;}
pre span.org-preprocessor                {color:#808080;font-weight:bold;}
pre span.org-constant                    {color:#D0372D;}
pre span.org-comment-delimiter           {color:#8D8D84;}
pre span.org-comment                     {color:#8D8D84;font-style:italic}
pre span.org-outshine-level-1            {color:#8D8D84;font-style:italic}
pre span.org-outshine-level-2            {color:#8D8D84;font-style:italic}
pre span.org-outshine-level-3            {color:#8D8D84;font-style:italic}
pre span.org-outshine-level-4            {color:#8D8D84;font-style:italic}
pre span.org-outshine-level-5            {color:#8D8D84;font-style:italic}
pre span.org-outshine-level-6            {color:#8D8D84;font-style:italic}
pre span.org-outshine-level-7            {color:#8D8D84;font-style:italic}
pre span.org-outshine-level-8            {color:#8D8D84;font-style:italic}
pre span.org-outshine-level-9            {color:#8D8D84;font-style:italic}
pre span.org-rainbow-delimiters-depth-1  {color:#707183;}
pre span.org-rainbow-delimiters-depth-2  {color:#7388d6;}
pre span.org-rainbow-delimiters-depth-3  {color:#909183;}
pre span.org-rainbow-delimiters-depth-4  {color:#709870;}
pre span.org-rainbow-delimiters-depth-5  {color:#907373;}
pre span.org-rainbow-delimiters-depth-6  {color:#6276ba;}
pre span.org-rainbow-delimiters-depth-7  {color:#858580;}
pre span.org-rainbow-delimiters-depth-8  {color:#80a880;}
pre span.org-rainbow-delimiters-depth-9  {color:#887070;}
pre span.org-sh-quoted-exec              {color:#FF1493;}

我可以使用默认emacs -q样式代替custom/theme.css吗?
CodyChan

默认样式是使用当前的emacs主题。您可以手动将默认主题的颜色复制到您的颜色中emacs_default_theme.css
Kaushal Modi 2015年

1
我没有尝试过,但是您可能可以重新定义org-html-fontify-code,以便它在字体化之前设置默认主题,然后恢复较早的主题。
Kaushal Modi 2015年

如果org模式接受了no-theme-inherit#+ BEGIN_SRC 的参数,这将非常有用,例如#+BEGIN_SRC haskell no-theme-inherit .. #+END_SRC,该参数仅使用emacs默认字体信息作为代码,在这种情况下为Haskell。
罗布·斯图尔特

我想指出的是,上面的css没有常规代码文本的条目,而只是显示为黑色。很高兴找到该条目。我能够自定义每个条目,例如pre span.org-function-name {color:rgb(255,000,255);},但是我无法更改大多数代码的黑色。什么span.org-??? 那会是吗?
史蒂夫

2

我找到了解决颜色问题的简单解决方案。导出之前,键入M-x customize-themes并打开leuven主题。这是一个带有浅色背景的主题,似乎适合在白纸上打印代码。导出后,再次关闭主题,您将恢复原始颜色。

我以某种方式假设我必须想出一些复杂的方式来切换配置以便导出,因此,我很放心,因为它是如此简单!

如果您经常这样做,可能值得建议HTML导出功能自动执行此操作:

(defvar my-org-html-export-theme 'tsdh-light)

(defun my-with-theme (orig-fun &rest args)
  (load-theme my-org-html-export-theme)
  (unwind-protect
      (apply orig-fun args)
    (disable-theme my-org-html-export-theme)))

(with-eval-after-load "ox-html"
  (advice-add 'org-export-to-buffer :around 'my-with-theme))

是的,这可行。但是,如果您处理大量经常导出为HTML的文件,则在主题之间来回切换会很烦人。
克里斯蒂安·赫伦茨

1
是的,我最终建议了导出功能:github.com/legoscia/dotemacs/blob/master/…–
legoscia

OK-也是解决方案。但是,为什么不遵循上述路线,并使用基于某些浅色主题的自定义CSS?
克里斯蒂安·赫伦茨

@legoscia这似乎对我不起作用。
stardiviner '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.