Bagaimana saya bisa keluar dari * dalam mode org untuk mencegah font tebal


12

Jika saya menulis sesuatu seperti *shrug*dalam mode org, itu akan secara otomatis dikategorikan sebagai teks tebal . Bagaimana saya bisa mencegah itu, yaitu benar-benar telah *shrug*muncul kata demi kata ketika diekspor?

Edit:

Saya masih ingin dapat menggunakan font tebal (tanpa harus mengubah sintaks bintang standar untuk teks tebal), dan seharusnya tidak masalah dengan format file apa file org saya diekspor, mis. Itu harus berfungsi untuk penurunan harga dan juga HTML ekspor.

Ini adalah beberapa hal penting , itu sebabnya ditulis dengan huruf tebal. Tetapi untuk hal lain, saya tidak punya Ide * mengangkat bahu *.


1
Jika Anda mengekspor ini ke LaTeX nanti, Anda bisa mencoba \ast{}shrug\ast{}atau \star{}shrug\star{}, mirip, dengan HTML Anda bisa menggunakan pengkodean entitas:, &#2a;atau jika menambahkan spasi sebelum atau setelah tanda bintang adalah pilihan, itu juga akan berfungsi.
wvxvw

Sepertinya jawaban suvayu hanya membungkusnya dengan penanda kata demi kata adalah yang Anda inginkan. Atau, Anda bisa memodifikasi org-penekanan-alist sehingga karakter lain digunakan untuk cetak tebal teks.
user2699

Tidak persis. = * shrug * = hasil dalam HTML yang diekspor untuk dibungkus dalam code-tag, dan dalam penurunan harga memiliki backticks. Saya ingin itu tidak diformat dengan cara apa pun.
timor

Pertanyaan yang diedit untuk mencerminkan bahwa mengubah org-penekanan-alist bukanlah pilihan. Saya tidak ingin mengubah semua huruf tebal yang sudah ada di file .org saya.
timor

2
Yang \ast{}shrug\ast{}disebutkan oleh wvxvw mungkin adalah pilihan terbaik Anda. itu mengekspor ke html sebagai ∗shrug∗dan ke lateks sebagai $\ast$shrug$\ast$menggunakan entitas karakter yang sesuai. org-toggle-pretty-entitiesmenampilkannya sebagai karakter UTF8 dalam buffer org.
mutbuerger

Jawaban:


9

Jawaban ini terinspirasi setelah saran kolektif pada daftar GNU emacs-org-mode untuk menggunakan org-entity( C-h i g (org) Special symbols) \ast{}alih-alih karakter spasi nol lebar (yang saya sarankan dalam jawaban saya yang lain di sini ).

Di bawah ini adalah solusi umum di mana pengguna tidak perlu mengingat entitas org untuk berbagai simbol. Ini memasukkan entitas org (jika tersedia) ketika pengguna melakukannya C-u SYMBOL; bekerja untuk C-u *, C-u /, C-u =, dll

(defun modi/org-entity-get-name (char)
  "Return the entity name for CHAR. For example, return \"ast\" for *."
  (let ((ll (append org-entities-user
                    org-entities))
        e name utf8)
    (catch 'break
      (while ll
        (setq e (pop ll))
        (when (not (stringp e))
          (setq utf8 (nth 6 e))
          (when (string= char utf8)
            (setq name (car e))
            (throw 'break name)))))))

(defun modi/org-insert-org-entity-maybe (&rest args)
  "When the universal prefix C-u is used before entering any character,
    insert the character's `org-entity' name if available.

    If C-u prefix is not used and if `org-entity' name is not available, the
    returned value `entity-name' will be nil."
  ;; It would be fine to use just (this-command-keys) instead of
  ;; (substring (this-command-keys) -1) below in emacs 25+.
  ;; But if the user pressed "C-u *", then
  ;;  - in emacs 24.5, (this-command-keys) would return "^U*", and
  ;;  - in emacs 25.x, (this-command-keys) would return "*".
  ;; But in both versions, (substring (this-command-keys) -1) will return
  ;; "*", which is what we want.
  ;; http://thread.gmane.org/gmane.emacs.orgmode/106974/focus=106996
  (let ((pressed-key (substring (this-command-keys) -1))
        entity-name)
    (when (and (listp args) (eq 4 (car args)))
      (setq entity-name (modi/org-entity-get-name pressed-key))
      (when entity-name
        (setq entity-name (concat "\\" entity-name "{}"))
        (insert entity-name)
        (message (concat "Inserted `org-entity' "
                         (propertize entity-name
                                     'face 'font-lock-function-name-face)
                         " for the symbol "
                         (propertize pressed-key
                                     'face 'font-lock-function-name-face)
                         "."))))
    entity-name))

;; Run `org-self-insert-command' only if `modi/org-insert-org-entity-maybe'
;; returns nil.
(advice-add 'org-self-insert-command :before-until #'modi/org-insert-org-entity-maybe)

Jadi ketika pengguna mengetik C-u *, \ast{}dimasukkan dan pesan di bawah ini ditampilkan di area gema,

Dimasukkan 'entitas-org' \ ast {} untuk simbol *.

Jika org-pretty-entitiesdiatur ke tatas, yang disisipkan \ast{}akan ditampilkan sebagai *.

Jika org-entitytidak ada untuk karakter X dan jika pengguna C-u X , X hanya dimasukkan 4 kali (seperti C-ubiasanya).


1
Ini terlihat sangat nyaman. Satu-satunya drwaback (menurut saya) yang tersisa, adalah file .org, yang tidak mengandung konstruk LaTeX sejauh ini, sekarang memiliki bit sintaks non-org-mode (LaTeX) yang tersebar di seluruh file. Ngomong-ngomong, apakah ada alasan bahwa tidak ada konstruksi seperti \*thisisnotbold\*ada?
timor

1
Ini juga sintaks org. Lihatlah org-entitiesdokumentasinya.
Kaushal Modi

8

Menggunakan char unicode SPACE ZERO WIDTH SPACE

Anda dapat gagal penekanan parsing tebal dengan menambahkan karakter spasi nol-lebar (ditunjukkan oleh [ZWS] di cuplikan di bawah) sebelum tanda bintang pertama atau setelah tanda bintang kedua.

Cuplikan di bawah ini diekspor dengan baik ke HTML di pengujian saya:

  • [ZWS] sebelum tanda bintang pertama

    This is some *bold* test and this is ā€‹[ZWS]*not bold*.
    
  • [ZWS] setelah tanda bintang kedua

    This is some *bold* test and this is *not bold*ā€‹[ZWS].
    

Anda dapat memasukkan ZERO WIDTH SPACE (nama unicode) dengan melakukan C-x 8 RET 200b RET.
Saya menggunakan ini sangat sering, jadi saya telah mengikat iniC-x 8 0 .


Memperbarui

Sesuai diskusi di milis emacs-org-mode , tidak disarankan menggunakan karakter non-ASCII; sebaliknya org-entitiesharus digunakan jika berlaku. Saya juga setuju dengan itu dan datang dengan ini solusi lain yang membuat memasukkan org-entitiessangat mudah ( C-u *dalam hal ini).


Secara teknis itu adalah cara yang cukup cepat untuk menyelesaikan masalah. Apakah ini bergantung pada mode-org yang tidak menafsirkan ZWS sebagai ruang kosong? Juga, saya khawatir solusinya adalah non-obvius untuk orang lain yang mengedit file org ...
timor

@timor, saya telah membuka diskusi ini di emacs-orgmode@gnu.orgmilis. Jika tertarik, Anda bisa mengikuti / menambah diskusi di sini .
Kaushal Modi

@timor, itu tidak jelas, tetapi dari semua solusi yang diberikan di sini, itu adalah satu-satunya yang berfungsi tanpa mengubah konfigurasi emacs, jadi ini adalah yang paling jelas jika Anda ingin berbagi file Anda.
user2699

@ user2699 FWIW, penggunaan entitas org dalam file akan langsung bekerja tanpa konfigurasi pengguna .. itu hanya penggunaan ascii biasa \ast{}dalam file. Solusi saya yang lain hanya membuat memasukkan \ast{}lebih cepat dan lebih mudah diingat.
Kaushal Modi

3

Dengan kata demi kata, jika Anda benar-benar bermaksud menggunakan beberapa markup di LaTeX yang diekspor, maka Anda bisa menggunakannya =*shrug*=. Namun jika Anda hanya ingin diekspor sebagai *shrug*, dan Anda ingin melakukan ini setiap saat, saya akan merekomendasikan filter . Namun, jika Anda hanya memerlukan ini untuk beberapa contoh *shrug*, Anda harus menggunakan alternatif yang disarankan oleh @wvxvw. Anda bisa melakukan ini dengan bersih menggunakan makro . Beberapa contoh mengikuti.

Filter

(defun my-bold (contents backend info)
  (when (org-export-derived-backend-p backend 'latex)
    (replace-regexp-in-string "\\`\\\\textbf{\\(.+\\)}"
                              "\\\\ast{}\\1\\\\ast{}" contents)))

(add-to-list 'org-export-filter-bold-functions 'my-bold)

Pada dasarnya filter di atas mencari \textbf{..}markup dalam string yang ditranskode, dan menggantinya \ast{}..\ast{}, tanpa mengubah apa pun yang dibungkus di dalamnya {..}. Saya belum menguji ekspresi reguler dan string pengganti, jadi mungkin ada kesalahan, tetapi Anda mendapatkan idenya. Demikian pula untuk menutupi backend lainnya, seseorang dapat memasukkan cuplikan tambahan seperti ini:

(when (org-export-derived-backend-p backend 'html)
   (replace-regexp-in-string "<b>\\(.+\\)</b>" "\&#2a;\\1\&#2a;" contents))

Peringatan yang sama berlaku untuk ekspresi reguler di atas.

Makro

Sumber organisasi:

#+macro: nobold @@latex:\ast{}$1\ast{}@@ @@html:&#2a;$1&#2a;@@

This text is *bold* this is nobold{{{not}}}

ekspor ke LaTeX sebagai:

This text is \textbf{bold} this is \ast{}not\ast{}

dan ke HTML sebagai:

This text is <b>bold</b> this is  &#2a;not&#2a;

Tentu saja Anda dapat menambahkan backend sebanyak yang Anda inginkan ke makro.

Sunting: seperti yang ditunjukkan Kaushal dalam komentar, cuplikan ekspor untuk lateks adalah opsional dalam hal ini. Namun saya lebih suka menggunakannya setiap kali lateks telanjang terlibat, karena saya merasa agak sulit untuk melacak daftar org-entitiesdan aturan khusus di balik mengidentifikasi lateks telanjang di sumber Org.

catatan:

  • contoh filter belum teruji,
  • Saya tidak tahu HTML, jadi mungkin ada beberapa kesalahan di bit masing-masing.

Seharusnya tidak ini mencukupi definisi makro: #+macro: nobold \ast{}$1\ast{}? astadalah salah satu anggota org-entitiesdaftar, yang menentukan seperti apa ekspor lateks, html, ascii, dll ("ast" "\\ast" t "&lowast;" "*" "*" "*"). : . Urutan elemen dalam daftar itu adalah "nama, penggantian LaTeX, LaTeX mathp, penggantian HTML, penggantian ASCII, penggantian Latin1, penggantian utf-8".
Kaushal Modi

@kaushalmodi Ya, tapi karena kita sudah tahu itu LaTeX, tidak ada salahnya memasukkannya ke dalam potongan lateks. Dalam pengalaman saya menggunakan snippet jauh lebih kuat karena ketidakjelasannya.
Quarky

-1

Ini dikendalikan oleh variabel org-penekanan-alist, dan dapat dengan mudah dimodifikasi.

  • Letakkan titik di atas teks tebal, gunakan perintah what-cursor-position C-u C-x =untuk menemukan wajah, perhatikan bahwa ia memiliki properti org-emphasis.
  • Panggil customize-groupdan cari penekanan-org
  • org-penekanan-alist harus muncul, dengan berbagai opsi untuk menandai teks.
  • Hapus entri yang sesuai dengan *
  • Terapkan perubahan, dan mulai ulang mode-org atau emacs
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.