Подсветка синтаксиса и отступ блока исходного кода в экспортированном html-файле для режима org


9

Когда я вставляю блок кода C в файл режима org, выделение синтаксиса и отступ исходного кода настраиваются так, как я хотел.

  1. Когда я экспортирую его в html-файл, подсветка синтаксиса в html-файле точно такая же, как в Emacs. Но подсветка синтаксиса лучше работает с цветовой темой моего Emacs. Например, {символ белого цвета в моем блоке кода C, но моя цветовая тема темная. Если я экспортирую его в html, фон html-файла тоже белый, это означает, что вы не можете видеть его {в блоке исходного кода Экспортированный HTML даже думал, что это там.

  2. Отступы исходного кода нормальны в моем Emacs (как я его настраивал), но отступ исходного кода в экспортированном HTML-файле будет другим, он добавляет больше места для отступов.

  3. Если я экспортирую тот же самый файл org emacs -q, они будут обычными в экспортированном html-файле, но подсветка синтаксиса и отступ исходного кода будут defaultконфигурацией Emacs. Таким образом, это означает, что настройки шрифтов init.elбудут влиять org-export.

Итак, мой вопрос: когда я экспортирую файл режима org, который содержит блок исходного кода, в html-файл (или, возможно, в другие форматы, такие как PDF), можно ли избавиться от всей моей конфигурации граней шрифтов о исходник и делай как в emacs -q?

Обновление :

Вторая проблема решается путем установки (setq org-src-preserve-indentation t)либо в файле инициализации, либо путем его запуска через M-:( eval-expression).

Обновление 2 :

Первая проблема решается с помощью Задать фон экспортированных из org блоков <code> в соответствии с темой .

Третья проблема не важна, если 1-я и 2-я проблемы решены.

Ответы:


10

Решение для этого охватывает настройки elisp, org-mode и css.

Elisp

По умолчанию информация о фонтике встраивается в экспортированный HTML-файл. Нам нужно отключить это и сообщить org-mode, что мы планируем указать информацию о форматировании шрифта, используя внешний файл CSS.

Я выбрал префикс имени класса html со org-строкой.

;; (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-")

орг-режим

В org-файле вы указываете, какой CSS-файл использовать. Этот файл будет содержать информацию о том, как вы хотите отформатировать каждый org-класс.

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

CSS

Вот мой собственный файл CSS темы, в который я скопировал цветовые коды из leuven-theme. Вы можете найти последнюю версию ниже CSS из моего Git .

/* 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

1
Я не пробовал этого, но вы, вероятно, можете переопределить его так org-html-fontify-code, чтобы он устанавливал тему по умолчанию до фонификации, а затем восстанавливал более раннюю тему.
Каушал Моди

Было бы очень полезно, если бы режим 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

ОК - тоже решение. Но почему бы не следовать вышеприведенному маршруту и ​​использовать собственный CSS, основанный на какой-то легкой теме?
Кристиан Херенц

@legoscia Это, кажется, не работает для меня.
stardiviner
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.