Comment définir des types de paragraphes personnalisés en mode organisation avec une police personnalisée?

Aug 17 2020

Comment puis-je définir des blocs de paragraphes personnalisés en mode organisation avec une police personnalisée, par exemple quelque chose comme

#+BEGIN_MYPAR
Some text 
#+END_MYPAR

Ensuite, je veux par exemple que ce bloc soit affiché en couleur de police orange, un point plus grand que le reste du texte, en gras et en retrait d'un onglet.

Comment puis-je faire ceci?

Modifier :

La question est de savoir comment les choses sont affichées dans le tampon emacs, pas dans les exportations (bien que cela puisse avoir été une question de suivi).

Réponses

2 Tobias Aug 27 2020 at 21:29

Vous atteignez votre objectif assez simplement si vous utilisez des blocs source au lieu de blocs spéciaux. Définissez votre propre mode majeur, par exemple mypar-modeà l'aide de define-generic-modeou define-derived-modeet configurez la police pour ce mode majeur comme vous le souhaitez.

Assurez-vous que org-src-fontify-nativelyet org-src-preserve-indentationsont tous les deux définis sur t de telle sorte que les myparblocs source dans le tampon d'Org ressemblent autant que possible aux tampons source fontifiés.

Si vous avez htmlizeinstallé, vous obtenez gratuitement la plupart du formatage souhaité dans l'exportation HTML.

Un exemple de code que j'ai testé avec Emacs 27.1 et 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)

Enfin une image à quoi myparressemble un bloc source dans Org:

1 Tobias Aug 23 2020 at 23:09

Notez d'abord que votre question est un peu vague. Où voulez-vous avoir ce formatage spécial du paragraphe - en exportation HTML ou exportation LaTeX? Ou même dans la représentation de l'Org-buffer dans Emacs?

Je vous donne ici une réponse pour l'exportation HTML et LaTeX.

L'idée principale de l'exportation HTML est de MYPARdéterminer la classe de style du texte dans le bloc spécial .

Vous pouvez définir votre propre style dans les #+HTML_HEADméta-lignes.

L'idée principale de l'exportation LaTeX est de MYPARdéterminer l'environnement LaTeX dans lequel le texte du bloc spécial est placé. Vous pouvez définir cet environnement personnalisé dans les #+LATEX_HEADERméta-lignes.

Un exemple:

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.