¿Cómo definir tipos de párrafos personalizados en modo org con fontificación personalizada?

Aug 17 2020

¿Cómo puedo definir bloques de párrafo personalizados en el modo de organización con una fuente personalizada, por ejemplo algo como

#+BEGIN_MYPAR
Some text 
#+END_MYPAR

Entonces quiero, por ejemplo, que este bloque se muestre en color de fuente naranja, un punto más grande que el resto del texto, en negrita y con sangría en una pestaña.

¿Cómo puedo hacer esto?

Editar :

La pregunta es sobre cómo se muestran las cosas en el búfer de emacs, no en las exportaciones (aunque esta puede haber sido una pregunta de seguimiento).

Respuestas

2 Tobias Aug 27 2020 at 21:29

Alcanza su objetivo de manera bastante simple si usa bloques de origen en lugar de bloques especiales. Defina su propio modo principal, digamos mypar-modecon la ayuda de define-generic-modeo define-derived-modey configure la fuente para ese modo principal como lo desee.

Asegúrese de que org-src-fontify-nativelyy org-src-preserve-indentationestén configurados en t de manera que los myparbloques de origen en el búfer de organización se parezcan lo más posible a los búferes de origen con fuente.

Si lo ha htmlizeinstalado, obtendrá la mayor parte del formato deseado en la exportación HTML de forma gratuita.

Un ejemplo de código que he probado con Emacs 27.1 y Org 9.3.7:

(require 'org)
(require 'cl-lib)
(define-generic-mode mypar-mode
  nil ;; comment-list
  nil ;; keyword-list
  ;; font-lock-list:
  '(("^.*$"
     ;; match-highlight:
     (0 ;; subexpression
      ;; facename:
      `(face (:inherit default :foreground "orange" :height 1.5 :weight bold) ;; we use an anonymous face
         ;; indent:
         line-prefix "\t"
         wrap-prefix "\t")
      )))
  nil ;; auto-mode-list
  '((lambda ()
      "Make `line-prefix' and `wrap-prefix' work in the source fontification buffer."
      (setq-local font-lock-extra-managed-props '(line-prefix wrap-prefix))
      ));; function-list
  "Formatting MYPAR blocks.")

(defun org+-hack-org-fontification ()
  "Make `wrap-prefix' and `line-prefix' text properties work in Org buffers."
  (setq-local font-lock-extra-managed-props (cl-union
                         '(line-prefix wrap-prefix)
                         font-lock-extra-managed-props)))

(add-hook 'org-mode-hook #'org+-hack-org-fontification)
(setq org-src-fontify-natively t
      org-src-preserve-indentation t)

Por fin una imagen de cómo se myparve un bloque fuente en Org:

1 Tobias Aug 23 2020 at 23:09

En primer lugar, tenga en cuenta que su pregunta es un poco vaga. ¿Dónde desea tener este formato especial del párrafo, en HTML-export o LaTeX-export? ¿O incluso en la representación del búfer Org en Emacs?

Te doy aquí una respuesta para la exportación de HTML y LaTeX.

La idea principal de la exportación HTML es que MYPARdetermina la clase de estilo del texto en el bloque especial .

Puede definir su propio estilo dentro de las #+HTML_HEADmeta-líneas.

La idea principal de la exportación LaTeX es que MYPARdetermina el entorno LaTeX donde se coloca el texto del bloque especial . Puede definir ese entorno personalizado dentro de las #+LATEX_HEADERmeta-líneas.

Un ejemplo:

Some text before my paragraph. Let this paragraph have some more text. It should have at least two lines.
#+BEGIN_MYPAR
Some text in my paragraph. Let this paragraph have some more text. It should have at least two lines. Even a third line would be nice to have. So we continue this text for some time.
#+END_MYPAR
Some text after my paragraph. Let this paragraph have some more text. It should have at least two lines.

* Style :noexport:
This section is just for definition of HTML and LaTeX formatting.
#+HTML_HEAD: <style>.MYPAR { color:orange; text-indent:8em; font-weight:bold; foint-size:110% }</style>
#+LATEX_HEADER: \usepackage{xcolor}
#+LATEX_HEADER: \newdimen\myparindent\myparindent8em
#+LATEX_HEADER: \newdimen\myparwidth\myparwidth\textwidth\advance\myparwidth-\myparindent
#+LATEX_HEADER: \newenvironment{MYPAR}{\par\noindent\hfill\begin{minipage}[t]{\myparwidth}\bf\color{orange}\fontsize{1em}{1.2em}\selectfont}{\par\xdef\tpd{\the\prevdepth}\end{minipage}\par\prevdepth\tpd}
See https://tex.stackexchange.com/questions/35933/indenting-a-whole-paragraph for using ~minipage~ for indenting a whole paragraph.