Como definir tipos de parágrafo personalizados no modo org com fonte personalizada?

Aug 17 2020

Como posso definir blocos de parágrafo personalizados no modo org com uma fonte personalizada, por exemplo, algo como

#+BEGIN_MYPAR
Some text 
#+END_MYPAR

Então eu quero, por exemplo, que este bloco seja exibido na cor de fonte laranja, um ponto maior que o resto do texto, em negrito e recuado em uma guia.

Como posso fazer isso?

Editar :

A questão é sobre como as coisas são exibidas no buffer do emacs, não nas exportações (embora esta possa ter sido uma questão de acompanhamento).

Respostas

2 Tobias Aug 27 2020 at 21:29

Você atinge seu objetivo de forma bastante simples se usar blocos de origem em vez de blocos especiais. Defina seu próprio modo principal, digamos mypar-modecom a ajuda de define-generic-modeou define-derived-modee configure a fonte para esse modo principal como você deseja.

Certifique-se de que org-src-fontify-nativelye org-src-preserve-indentationestão configurados para t de forma que os myparblocos de origem no buffer Org se pareçam tanto quanto possível com os buffers de origem com fonte.

Se você htmlizeinstalou, obtém a maior parte da formatação desejada na exportação de HTML gratuitamente.

Um exemplo de código que testei com Emacs 27.1 e 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 fim, uma imagem de como um myparbloco de origem se parece na Org:

1 Tobias Aug 23 2020 at 23:09

Em primeiro lugar, observe que sua pergunta é um pouco vaga. Onde você deseja ter essa formatação especial do parágrafo - em HTML-export ou LaTeX-export? Ou mesmo na representação do Org-buffer no Emacs?

Apresento aqui uma resposta para exportação de HTML e LaTeX.

A ideia principal para a exportação de HTML é que MYPARdetermina a classe de estilo do texto no bloco especial .

Você pode definir seu próprio estilo dentro de #+HTML_HEADmeta-linhas.

A ideia principal para a exportação LaTeX é que MYPARdetermina o ambiente LaTeX onde o texto do bloco especial é colocado. Você pode definir esse ambiente personalizado dentro de #+LATEX_HEADERmeta-linhas.

Um exemplo:

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.