Bagaimana cara menentukan jenis paragraf khusus dalam mode org dengan fontifikasi khusus?

Aug 17 2020

Bagaimana saya bisa mendefinisikan blok paragraf khusus dalam mode org dengan fontifikasi khusus, misalnya sesuatu seperti

#+BEGIN_MYPAR
Some text 
#+END_MYPAR

Lalu saya ingin misalnya blok ini ditampilkan dengan warna font oranye, satu poin lebih besar dari teks lainnya, wajah tebal dan diindentasi oleh satu tab.

Bagaimana saya bisa melakukan ini?

Edit :

Pertanyaannya adalah tentang bagaimana hal-hal ditampilkan di buffer emacs, bukan di ekspor (meskipun ini mungkin pertanyaan lanjutan).

Jawaban

2 Tobias Aug 27 2020 at 21:29

Anda mencapai tujuan Anda cukup sederhana jika Anda menggunakan blok sumber, bukan blok khusus. Tentukan mode utama Anda sendiri, katakan mypar-modedengan bantuan define-generic-modeatau define-derived-modedan atur fontifikasi untuk mode utama itu seperti yang Anda inginkan.

Pastikan bahwa org-src-fontify-nativelydan org-src-preserve-indentationkeduanya disetel ke t sehingga myparblok sumber di buffer Org terlihat sebanyak mungkin seperti buffer sumber fontified.

Jika Anda telah htmlizemenginstal Anda mendapatkan sebagian besar format yang diinginkan dalam ekspor HTML secara gratis.

Contoh kode yang telah saya uji dengan Emacs 27.1 dan 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)

Akhirnya gambar bagaimana myparblok sumber terlihat di Org:

1 Tobias Aug 23 2020 at 23:09

Catatan pertama, pertanyaan Anda agak kabur. Di mana Anda ingin memiliki pemformatan khusus paragraf ini - dalam HTML-export atau LaTeX-export? Atau bahkan dalam representasi Org-buffer di Emacs?

Saya memberi Anda di sini jawaban untuk HTML- dan LaTeX-export.

Ide utama untuk ekspor-HTML adalah yang MYPARmenentukan kelas gaya teks di blok khusus .

Anda dapat menentukan gaya Anda sendiri dalam #+HTML_HEADmeta-line.

Ide utama untuk LaTeX-export adalah yang MYPARmenentukan lingkungan LaTeX di mana teks dari blok khusus diletakkan di dalamnya. Anda dapat menentukan lingkungan kustom itu dalam #+LATEX_HEADERmeta-baris.

Sebuah contoh:

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.