La coloration syntaxique et l'indentation du bloc de code source dans le fichier html exporté pour le mode org

9

Lorsque j'insère un bloc de code C dans un fichier en mode org, la coloration syntaxique et l'indentation du code source sont personnalisées comme je le souhaitais.

  1. Lorsque je l'exporte dans un fichier html, la mise en évidence de la syntaxe dans le fichier html est exactement la même que dans Emacs. Mais la mise en évidence de la syntaxe fonctionne mieux avec le thème de couleur de mes Emacs. Par exemple, le {symbole est blanc dans mon bloc de code C, mais mon thème de couleur est sombre, si je l'exporte en html, l'arrière-plan du fichier html est également blanc, cela signifie, vous ne pouvez pas voir {dans le bloc de code source de exporté html même pensé qu'il est là.

  2. L'indentation du code source est normale dans mes Emacs (comme je l'ai personnalisé), mais l'indentation du code source dans le fichier html exporté sera différente, cela ajoute plus d'espaces d'indentation.

  3. Si j'exporte le même fichier org dans emacs -q, ils sont normaux dans le fichier html exporté, mais la coloration syntaxique et le retrait du code source seront la defaultconfiguration d'Emacs. Cela signifie donc que les configurations des faces de police init.elaffecteront org-export.

Donc, ma question est: quand j'exporte un fichier en mode org qui contient un bloc de code source dans un fichier html (ou peut-être d'autres formats tels que PDF également), est-il possible de se débarrasser de toute ma propre configuration de polices sur le le code source et le faire comme dans emacs -q?

Mise à jour :

Le deuxième problème est résolu en définissant (setq org-src-preserve-indentation t)soit dans le fichier init, soit en l'exécutant via M-:( eval-expression).

Update2 :

Le premier problème est résolu en définissant l'arrière-plan des blocs <code> exportés par l'organisation en fonction du thème .

Le troisième problème n'est pas important si les 1er et 2e problèmes sont résolus.

CodyChan
la source

Réponses:

10

La solution pour cela couvre la personnalisation elisp, org-mode et css.

elisp

Par défaut, les informations de police sont incorporées dans le fichier html exporté. Nous devons désactiver cela et indiquer au mode organisationnel que nous prévoyons de spécifier les informations de formatage de police à l'aide d'un fichier css externe.

J'ai choisi de préfixer les noms de classe html avec une org-chaîne.

;; (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-mode

Dans le fichier org, vous spécifiez ensuite le fichier css à utiliser. Ce fichier contiendra des informations sur la façon dont vous souhaitez formater chaque org-classe.

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

css

Voici mon fichier css de thème personnalisé dans lequel j'ai copié les codes couleurs du leuven-theme. Vous pouvez trouver la dernière version du css ci-dessous de mon 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;}
Kaushal Modi
la source
Puis-je simplement utiliser le emacs -qstyle par défaut au lieu de custom/theme.css?
CodyChan
Le style par défaut consiste à utiliser le thème emacs actuel. Vous pouvez copier manuellement les couleurs du thème par défaut sur votreemacs_default_theme.css
Kaushal Modi
1
Je n'ai pas essayé cela, mais vous pouvez probablement redéfinir de org-html-fontify-codetelle sorte qu'il définit le thème par défaut avant la police, puis restaure le thème précédent.
Kaushal Modi
Il serait vraiment utile que le mode org accepte un no-theme-inheritargument à # + BEGIN_SRC, par exemple #+BEGIN_SRC haskell no-theme-inherit .. #+END_SRCqui utilise simplement les informations de police par défaut emacs pour le code, dans ce cas Haskell.
Rob Stewart
Je tiens à souligner que le css ci-dessus n'a pas d'entrée pour le texte de code normal et il apparaît juste en noir. Ce serait bien de trouver cette entrée. Je peux personnaliser chaque entrée, par exemple pre span.org-function-name {color: rgb (255,000,255);} mais je ne peux pas changer la couleur noire de la plupart du code. Quel span.org - ??? serait-ce?
Steve
2

J'ai trouvé une solution / contournement simple pour le problème de couleur. Avant d'exporter, saisissez M-x customize-themeset activez le leuventhème. C'est un thème avec un fond clair qui semble adapté à l'impression de code sur du papier blanc. Après l'exportation, désactivez à nouveau le thème et vous reviendrez avec vos couleurs d'origine.

J'ai supposé que je devrais trouver une façon compliquée de changer de configuration pour l'exportation, donc je suis soulagé que ce soit aussi simple!

Si vous faites cela souvent, il peut être utile de conseiller à la fonction d'exportation HTML de le faire automatiquement:

(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))
legoscia
la source
Oui, ça marche. Mais si vous travaillez avec un grand nombre de fichiers que vous exportez fréquemment au format HTML, vous trouverez très ennuyeux de basculer entre les thèmes.
Christian Herenz
1
Oui, j'ai fini par conseiller la fonction d'exportation: github.com/legoscia/dotemacs/blob/master/…
legoscia
OK - aussi une solution. Mais, pourquoi ne pas suivre l'itinéraire ci-dessus et utiliser un CSS personnalisé basé sur un thème léger?
Christian Herenz
@legoscia Cela semble ne fonctionne pas pour moi.
stardiviner du