Фон встроенного изображения по умолчанию в режиме Org

9

Когда изображение имеет прозрачный фон, Emacs, конечно, учитывает это.

К сожалению, это может привести к проблемам с отображением:

черный текст на темном фоне

Есть ли способ отобразить определенный цвет (например, белый) позади изображения? Кажется, есть некоторая поддержка для этого в изображениях ImageMagick .

Для конкретного материала, с которым я сейчас работаю, может быть установлен цвет фона, однако для этого мне нужно добавить несколько дополнительных линий к каждой фигуре , что не идеально. Я бы хотел получить его там, где для встроенных изображений, отображаемых в режиме org, задан цвет фона по умолчанию.

(Примечание: это не специфично для org-babel, просто именно так я получаю эти изображения прямо сейчас)

Дж Дэвид Смит
источник

Ответы:

8

После долгих копаний, кажется, нет встроенной опции, чтобы отрегулировать это в Org или вообще. Система изображений не имеет никакого способа настроить фон по умолчанию, а у org нет способа установить это :backgroundсвойство. Тем не менее, похоже, что большинство изображений поддерживают:background свойство display.

Я добавил эту функцию в Org, изменив (читай: копировать и вставлять .emacs.dс изменением в 1 строку) org-display-inline-images.

Я не буду воспроизводить здесь функцию, потому что она довольно длинная. Строка 51 функции гласит:

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

Я определил новую настраиваемую переменную org-inline-image-background, которая может содержать либо nil(прозрачный фон), либо цвет:

(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)))

Затем я добавил его в строку 51:

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

Это прекрасно работает, и его можно настроить с помощью палитры цветов, чтобы оно соответствовало всем моим требованиям.

черный текст светлый фон

Дж Дэвид Смит
источник
Похоже, вы проделали большую работу, чтобы понять это. Вы хотите отправить патч для этого или попросить добавить его в org-mode по электронной почте emacs-orgmode@gnu.org?
Каушал Моди
Как только я проверю это (убедитесь, что ничего не сломалось), я тоже надеюсь.
Дж. Дэвид Смит
Новая версия 8.0 в режиме Org, похоже, начала использовать наложение для отображения встроенных изображений. Есть ли способ изменить цвет фона по умолчанию для наложения?
Stardiviner
@stardiviner это именно то, что он делает
J David Smith
Я проверил свою версию Org, это так 8.3.4. Я проверил org-display-inline-imagesисходный код, не нашел определения вашего кода. Вот исходный код: gist.github.com/649a7b36031d6adb4a96
stardiviner
3

Я получил лучшее решение с советом.

(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
источник
Хорошее решение. Могу ли я предложить переименовать функцию совета, чтобы удалить org-префикс, поскольку решение применяется гораздо шире? С темами не по умолчанию целью, вероятно, является белый фон (который часто не является фоном лица по умолчанию), поэтому (list :background "white")может быть полезным примером.
ebpa
1
Это вариант пользователя, вы считаете правильным. Я думаю, что ваш комментарий достаточно для пользователя, который нашел этот код. :)
stardiviner