테마에 따라 조직에서 내 보낸 <code> 블록의 배경 설정


24

조직 모드 파일을 자주 내보내고 거의 모든 파일에 코드가 있습니다. 코드를 내 보내면 테마에 따라 텍스트가 색칠되지만 어두운 테마와 밝은 테마를 정기적으로 전환합니다. 밝은 테마의 경우 <code>블록에 밝은 배경이 필요하고 어두운 테마의 경우 어두운 배경이 있어야합니다 (그렇지 않으면 회색 배경에 밝은 노란색 텍스트가 표시되어 읽을 수 없습니다).

어두운 배경에는이 줄을 추가해야합니다.

#+HTML_HEAD: <style>pre.src {background-color: #303030; color: #e5e5e5;}</style>

밝은 색상의 배경으로 전환 할 때마다 제거해야합니다.

내보낼 때 현재 테마의 배경색을 자동으로 감지하여 내 보낸 HTML의 CSS에서 사용할 수있는 방법이 있습니까?

편집하다

나는 Jordon의 대답으로 가고 있습니다 (Jordon, 당신은 카르마 포인트를 얻습니다!). 그러나 나는 그의 대답의 약간 수정 된 버전이기 때문에 코드에 추가 한 솔루션을 게시하고 싶었습니다.

(defun my/org-inline-css-hook (exporter)
  "Insert custom inline css to automatically set the
background of code to whatever theme I'm using's background"
  (when (eq exporter 'html)
    (let* ((my-pre-bg (face-background 'default))
           (my-pre-fg (face-foreground 'default)))
      (setq
       org-html-head-extra
       (concat
        org-html-head-extra
        (format "<style type=\"text/css\">\n pre.src {background-color: %s; color: %s;}</style>\n"
                my-pre-bg my-pre-fg))))))

(add-hook 'org-export-before-processing-hook 'my/org-inline-css-hook)

배경색뿐만 아니라 전경색도 설정합니다. 또한 기존 org-html-head-extra설정에 줄을 추가하여 실수로 다른 HTML을 덮어 쓰지 않습니다. 나는 테스트했고 이것이 나에게 효과적이다!


1
방법이 있다고 확신하지만 내보낼 때 항상 동일한 테마를 적용하는 것이 낫지 않습니까? 아니면 의도적으로 다른 테마로 내보내십니까?
Malabarba

@ Malabarba의 의도는 현재 사용중인 테마를 내보내고 코드를 읽을 수 있도록하는 것입니다. 많은 테마가 (로도) 완전히 전환되지 않기 때문에 disable-theme하루에 여러 번 HTML을 내보내기 위해 별도의 테마로 Emacs를 다시 시작하고 싶지 않습니다.
Lee H

1
올바르게 이해하면 현재 설정에서 이미 코드 블록에서 테마의 색상을 사용하고 있으며 문제는 테마의 배경이 사용되지 않는다는 것입니다. 내가 틀렸다면 제목에 대한 수정 사항을 롤백 해주세요.
Malabarba

@ Malabarba 현재 설정은 코드 블록의 배경색을 지정하지 않습니다 (도움이된다면 CSS에서 배경색을 하드 코딩 할 수는 있지만). 테마의 배경색을 조직 모드 코드 블록에 사용하고 싶습니다. 새로운 타이틀이 저에게 효과적입니다.
Lee H

위의 솔루션에는 두 가지 문제가 있습니다. 먼저 'gray80'과 같은 색상은 CSS 값으로 올바르게 변환되지 않으며 설정되지 않습니다. 두 번째로, 내보내기가 실행될 때마다 org-html-head-extra스타일의 기능이 손상되지는 않지만 무한한 성장으로 이어집니다.
RP Dillon

답변:


10

첫째, 조직이 htmlize테마에 따라 소스 코드 블록을 자동으로 채색 하는 데 사용할 수 있다고 생각 합니다.

또는.

http://definitelyaplug.b0.cx/post/custom-inlined-css-in-org-mode-html-export/를 확인 하십시오 . org-export-before-processing-hookHTML 내보내기 전에 사용자 정의 CSS를 조직 문서에 던지는 방법을 보여주는 훌륭한 예가 있습니다.

사이트가 다운되는 경우를위한 코드는 다음과 같습니다.

html 내보내기에서 org는 현재 디렉토리에서 styles.css 파일 또는 .emacs.d 디렉토리에서 기본 파일을 찾아 해당 CSS를 문서에 삽입합니다. 이것은 훌륭하지만 사용 사례에 완벽하지는 않습니다.

(defun my-org-inline-css-hook (exporter)
  "Insert custom inline css"
  (when (eq exporter 'html)
    (let* ((dir (ignore-errors (file-name-directory (buffer-file-name))))
           (path (concat dir "style.css"))
           (homestyle (or (null dir) (null (file-exists-p path))))
           (final (if homestyle "~/.emacs.d/org-style.css" path)))
      (setq org-html-head-include-default-style nil)
      (setq org-html-head (concat
                           "<style type=\"text/css\">\n"
                           "<!--/*--><![CDATA[/*><!--*/\n"
                           (with-temp-buffer
                             (insert-file-contents final)
                             (buffer-string))
                           "/*]]>*/-->\n"
                           "</style>\n")))))

(add-hook 'org-export-before-processing-hook 'my-org-inline-css-hook)

원하는 방식으로 작동하도록 몇 가지 방법으로이를 사용자 지정할 수 있습니다.

한 가지 방법은 테마를 기반으로 CSS를 수동으로 빌드하고 삽입하는 것입니다.

다음은 pre.src기본 faces : background 속성의 16 진수 값으로 배경을 설정하는 수정 된 버전입니다 .

(defun my-org-inline-css-hook (exporter)
  "Insert custom inline css"
  (when (eq exporter 'html)
    (let ((my-pre-bg (face-background 'default)))
      (setq org-html-head-include-default-style nil)
      (setq org-html-head
            (format "<style type=\"text/css\">\n pre.src { background-color: %s;}</style>\n" my-pre-bg)))))

(add-hook 'org-export-before-processing-hook 'my-org-inline-css-hook)

1
고마워요 조던, 대단해! 약간 수정 된 버전으로 원래 질문을 업데이트했지만 현상금과 솔루션을 얻을 수 있습니다!
Lee H
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.