2015-05-31 2 views
0

Моя проблема заключается в экспорте этой орг-блокЭкспорт орг специальный текстовый блок Латекс

#+BEGIN_NOTE 
some text here 
#+END_NOTE 

к этому Latex код

\begin{bclogo}[logo=\bcattention, noborder=true, barre=none]{some text here} 
\end{bclogo} 

Есть ли способ настроить как экспортировать в Latex этот блок текста?

ответ

1

Вы можете сделать это, как это с помощью пользовательского блока в орг-режиме:

+ begin_bclogo

некоторый текст здесь

+ end_bclogo

Затем используйте фильтр, чтобы изменить экспорт следующим образом:

(defun ox-mrkup-filter-special-block (text back-end info) 
    (let ((text (replace-regexp-in-string "\\\\begin{bclogo}" "\\\\begin{bclogo}[logo=\\\\bcattention, noborder=true, barre=none]{" text))) 
    (replace-regexp-in-string "\\\\end{bclogo}" "}\\\\end{bclogo}" text))) 

(let ((org-export-filter-special-block-functions '(ox-mrkup-filter-special-block))) 
(find-file (org-export-to-file 'latex "custom.tex"))) 

Этот экспорт в:

\begin{bclogo}[logo=\bcattention, noborder=true, barre=none]{ 
some text here 
}\end{bclogo} 

Это похоже на то, что вы хотите. Я не уверен, как вы можете получить тело в окружающей среде. Я думаю, вам нужно будет использовать атрибут для установки текста в {}, а затем использовать текст как тело. Это, вероятно, непросто реализовать в фильтре и лучше реализовать в пользовательском экспорте.

+0

John благодарит за ваш ответ. Этот скрипт работает, но мне нужно создать среду 'NOTE', так как документ должен быть экспортирован в html и Latex. Поэтому мой вопрос может быть лучше: есть ли способ изменить окружение '# + BEGIN NOTE # + END NOTE' способом, подобным' FIGURE', чтобы вставить атрибут Latex? –

+0

Вы можете использовать внутреннюю переменную в фильтре, чтобы делать латексные или html-конкретные вещи в блоке cond. Каким должен выглядеть код html для экспорта? Возможно, вам придется подумать о создании специализированного экспортера, хотя это будет создавать то, что вы хотите для специальных блоков, с помощью специального кода. –

1

Вы можете сохранить NOTE среды и заменить его bclogo через фильтр из латекса конкретного (я изменил код Джона):

(defun my/latex-process-NOTE-blocks (text backend info) 
    "Filter special blocks from latex export." 
    (when (eq backend 'latex) 
    (let ((text (replace-regexp-in-string "\\\\begin{NOTE}" "\\\\begin{bclogo}[logo=\\\\bcattention, noborder=true, barre=none]{" text))) 
     (replace-regexp-in-string "\\\\end{NOTE}" "}\\\\end{bclogo}" text)))) 

(eval-after-load 'ox '(add-to-list 
         'org-export-filter-special-block-functions 
         'my/latex-process-NOTE-blocks)) 

Если вы хотите сделать это со всеми латексными полученными бэкэндами, вы можете замените (eq backend 'latex) на (org-export-derived-backend-p backend 'latex).

Если вы хотите, чтобы убедиться, что блок начинается с \begin{NOTE}:

(defun string/starts-with (string prefix) 
    "Return t if STRING starts with prefix." 
    (and (string-match (rx-to-string `(: bos ,prefix) t) string) t)) 

(defun my/latex-process-NOTE-blocks (text backend info) 
    "Filter special blocks from latex export." 
    (when (eq backend 'latex) 
    (if (string/starts-with text "\\begin{NOTE}") 
     (let ((text (replace-regexp-in-string "\\\\begin{NOTE}" "\\\\begin{bclogo}[logo=\\\\bcattention, noborder=true, barre=none]{" text))) 
      (replace-regexp-in-string "\\\\end{NOTE}" "}\\\\end{bclogo}" text))))) 

(eval-after-load 'ox '(add-to-list 
         'org-export-filter-special-block-functions 
         'my/latex-process-NOTE-blocks)) 
2

Могу ли я предложить использовать вместо что-то вроде:

#+LaTeX_HEADER: \usepackage[tikz]{bclogo} 
... 
#+ATTR_LATEX: :options [logo=\bcattention, noborder=true, barre=none]{some title here} 
#+BEGIN_bclogo 
some text here 
#+END_bclogo 

Используя LaTeX специальный блок не очень хорошо подходит здесь, если вы действительно хотите использовать заметки.

Смежные вопросы