Latar Belakang Gambar Inline Default dalam Mode Org

9

Ketika sebuah gambar memiliki latar belakang transparan, Emacs tentu saja menghormatinya.

Sayangnya, ini dapat menyebabkan masalah dengan tampilan:

teks hitam dengan latar belakang gelap

Apakah ada cara untuk menampilkan warna tertentu (misalnya putih) di belakang gambar? Tampaknya ada beberapa dukungan untuk itu di gambar ImageMagick .

Hal-hal spesifik yang sedang saya kerjakan sekarang dapat memiliki set warna latar belakang, namun saya harus menambahkan beberapa baris tambahan ke setiap gambar untuk melakukan itu, yang kurang dari ideal. Saya ingin membawanya ke tempat gambar inline ditampilkan dalam mode-org yang memiliki warna latar belakang yang ditetapkan secara default.

(Catatan: ini bukan spesifik org-babel, kebetulan saja bagaimana saya mendapatkan gambar-gambar ini sekarang)

J David Smith
sumber

Jawaban:

8

Setelah banyak menggali, tampaknya tidak ada opsi bawaan untuk menyesuaikan ini di Org atau secara umum. Sistem gambar tidak memiliki cara untuk menyesuaikan latar belakang default, dan org tidak memiliki cara untuk mengatur :backgroundproperti. Namun, itu terlihat seperti kebanyakan gambar mendukung :backgroundproperti tampilan.

Saya menambahkan fungsionalitas ini ke Org dengan memodifikasi (baca: salin dan tempel ke dalamnya .emacs.ddengan perubahan 1 baris) org-display-inline-images.

Saya tidak akan mereproduksi fungsi di sini, karena agak panjang. Baris 51 dari fungsi tersebut berbunyi:

(setq img (save-match-data (create-image file type nil :width width)))

Saya mendefinisikan variabel baru yang dapat disesuaikan org-inline-image-background, yang dapat menampung nil(latar belakang transparan) atau warna:

(defcustom org-inline-image-background nil
  "The color used as the default background for inline images.
  When nil, use the default face background."
  :group 'org
  :type '(choice color (const nil)))

Kemudian, saya menambahkannya ke baris 51:

(setq img (save-match-data (create-image file type nil :width width 
                                                       :background org-inline-image-background)))

Ini berfungsi dengan baik dan dapat dikustomisasi menggunakan color picker, sehingga memenuhi semua persyaratan saya.

latar belakang cahaya teks hitam

J David Smith
sumber
Sepertinya Anda melakukan banyak pekerjaan untuk mencari tahu hal ini. Apakah Anda ingin mengirimkan tambalan untuk ini atau meminta ini ditambahkan ke mode-org dengan mengirim email ke [email protected]?
Kaushal Modi
Setelah saya lewati langkahnya (pastikan tidak merusak apa-apa) Saya juga berharap.
J David Smith
Org-mode versi 8.0 tampaknya mulai menggunakan overlay untuk menampilkan gambar sebaris, Apakah ada cara untuk mengubah warna latar default overlay?
stardiviner
@ stardiviner, itulah yang dilakukan
J David Smith
Saya memeriksa versi Organisasi saya 8.3.4. Saya memeriksa org-display-inline-imageskode sumber, belum menemukan definisi kode Anda. Berikut ini adalah kode sumber: gist.github.com/649a7b36031d6adb4a96
stardiviner
3

Saya mendapat solusi yang lebih baik dengan saran.

(defun create-image-with-background-color (args)
  "Specify background color of Org-mode inline image through modify `ARGS'."
  (let* ((file (car args))
         (type (cadr args))
         (data-p (caddr args))
         (props (cdddr args)))
    ;; get this return result style from `create-image'
    (append (list file type data-p)
            (list :background (face-background 'default))
            props)))

(advice-add 'create-image :filter-args
            #'create-image-with-background-color)
stardiviner
sumber
Solusi yang bagus. Mungkin saya menyarankan mengubah nama fungsi saran untuk menghapus org-awalan karena solusi berlaku jauh lebih luas? Dengan tema yang tidak standar, tujuannya mungkin adalah latar belakang putih (yang seringkali bukan latar belakang wajah standar), jadi (list :background "white")mungkin ini contoh yang berguna.
ebpa
1
Itu adalah opsi pengguna, pertimbangan Anda benar. Saya pikir komentar Anda cukup untuk pengguna yang menemukan kode ini. :)
stardiviner