El resaltado de sintaxis y la sangría del bloque de código fuente en el archivo html exportado para el modo org


9

Cuando inserto el bloque de código C dentro de un archivo de modo de organización, el resaltado de sintaxis y la sangría del código fuente se personalizan como quería.

  1. Cuando lo exporto a un archivo html, el resaltado de sintaxis en el archivo html es exactamente el mismo que en Emacs. Pero el resaltado de sintaxis funciona mejor con el tema de color de mis Emacs. Por ejemplo, el {símbolo es blanco en mi bloque de código C, pero mi tema de color es oscuro, si lo exporto a html, el fondo del archivo html también es blanco, es decir, no se puede ver {en el bloque de código fuente de HTML exportado incluso pensé que estaba allí.

  2. La sangría del código fuente es normal en mis Emacs (como lo personalicé), pero la sangría del código fuente en el archivo html exportado será diferente, agrega más espacios para la sangría.

  3. Si exporto el mismo archivo de organización emacs -q, son normales en el archivo html exportado, pero el resaltado de sintaxis y la sangría del código fuente serán la defaultconfiguración de Emacs. Por lo tanto, significa que las configuraciones de caras de fuente init.elafectarán org-export.

Entonces, mi pregunta es: cuando exporto un archivo de modo de organización que contiene el bloque de código fuente en un archivo html (o tal vez otros formatos como PDF), ¿es posible deshacerme de toda mi configuración de fuentes de fuentes sobre el código fuente y hacerlo como en emacs -q?

Actualización :

El segundo problema se resuelve estableciéndolo (setq org-src-preserve-indentation t)en el archivo de inicio o ejecutándolo a través de M-:( eval-expression).

Actualización2 :

El primer problema se resuelve estableciendo el fondo de los bloques <code> exportados por org según el tema .

El tercer problema no es importante si se resuelven los problemas primero y segundo.

Respuestas:


10

La solución para esto abarca la personalización de elisp, org-mode y css.

elisp

De forma predeterminada, la información de fuente está incrustada en el archivo html exportado. Necesitamos deshabilitar eso y decirle al modo org que estamos planeando especificar la información de formato de fuente usando un archivo css externo.

He elegido prefijar los nombres de clase html con una org-cadena.

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

modo org

En el archivo org, usted especifica qué archivo css usar. Este archivo contendrá información sobre cómo desea formatear cada org-clase.

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

css

Aquí está mi archivo css de tema personalizado en el que he copiado los códigos de color de leuven-theme. Puede encontrar la última versión de la siguiente CSS de mi 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;}

¿Puedo usar el emacs -qestilo predeterminado en lugar de custom/theme.css?
CodyChan

El estilo predeterminado es usar el tema actual de emacs. Puede copiar manualmente los colores que el tema predeterminado tiene en suemacs_default_theme.css
Kaushal Modi

1
No lo he probado, pero probablemente pueda redefinirlo de org-html-fontify-codemodo que establezca el tema predeterminado antes de la fuente y luego restaure el tema anterior.
Kaushal Modi

Sería realmente útil si el modo org aceptara un no-theme-inheritargumento para # + BEGIN_SRC, por ejemplo, #+BEGIN_SRC haskell no-theme-inherit .. #+END_SRCque solo utilizara la información de fuente predeterminada de emacs para el código, en este caso Haskell.
Rob Stewart

Quiero señalar que el css anterior no tiene entrada para el texto del código normal y simplemente aparece en negro. Sería bueno encontrar esa entrada. Puedo personalizar cada entrada, por ejemplo pre span.org-function-name {color: rgb (255,000,255);} pero no puedo cambiar el color negro de la mayor parte del código. ¿Qué span.org - ??? ¿sera eso?
Steve

2

Encontré una solución / solución simple para el problema del color. Antes de exportar, escriba M-x customize-themesy active el leuventema. Es un tema con un fondo claro que parece adecuado para imprimir código en papel blanco. Después de exportar, apague el tema nuevamente y volverá con sus colores originales.

De alguna manera asumí que tendría que encontrar una forma complicada de cambiar la configuración para exportar, ¡así que me siento aliviado de que fuera así de simple!

Si hace esto con frecuencia, puede valer la pena recomendarle a la función de exportación HTML que lo haga automáticamente:

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

Si, esto funciona. Pero si trabaja con muchos archivos que exporta con frecuencia a HTML, le resultará muy molesto alternar entre los temas.
Christian Herenz

1
Sí, terminé aconsejando la función de exportación: github.com/legoscia/dotemacs/blob/master/…
legoscia

OK, también una solución. Pero, ¿por qué no seguir la ruta anterior y usar un CSS personalizado basado en algún tema ligero?
Christian Herenz

@legoscia Esto parece no funcionar para mí.
stardiviner
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.