É possível exportar o conteúdo de subárvores sem seus títulos?

28

Eu rascunho documentos no modo organizacional e os exporto para LaTeX, HTML etc., conforme necessário. Eu freqüentemente uso a tag :no_export:sempre que não quero que uma determinada subárvore apareça na saída.

O que eu também quero é que o desejo é que a exportação ignore completamente certos títulos de subárvore , mas não ignore o conteúdo da subárvore sob esse cabeçalho. Em outras palavras, certas subárvores devem ser exportadas como se seu conteúdo fosse apenas uma continuação do pai, em vez de ter sua própria subárvore.

Estou idealmente imaginando uma tag como :no_title:. Quero que o contorno do meu modo organizacional seja mais ou menos do jeito que estou acostumado. Mas eu consideraria outras abordagens com resultados semelhantes.

Para ilustrar, aqui está um MWE de um documento redigido no modo organizacional.

* Chapter 1
** Section 1
*** Paragraph 1      :no_title:
First paragraph of text in the section.
*** Paragraph 2      :no_title:
Second paragraph of text in the section.
* Chapter 2
** Section 1
*** Subsection 1
**** Paragraph 1      :no_title:
First paragraph of text in the subsection.
**** Paragraph 2      :no_title:
Second paragraph of text in the subsection

Quando exporto isso atualmente, recebo algo assim:

1 capítulo 1

1.1 Seção 1

1.1.1 Parágrafo 1: no_title:

Primeiro parágrafo do texto na seção.

1.1.2 Parágrafo 2: no_title:

Segundo parágrafo do texto na seção.

2 Capítulo 2

2.1 Seção 1

2.1.1 Subseção 1

2.1.1.1, parágrafo 1: no_title:

Primeiro parágrafo do texto na subseção.

Mas o que eu quero é mais assim:

1 capítulo 1

1.1 Seção 1

Primeiro parágrafo do texto na seção.

Segundo parágrafo do texto na seção.

2 Capítulo 2

2.1 Seção 1

2.1.1 Subseção 1

Primeiro parágrafo do texto na subseção.

Brian Z
fonte

Respostas:

27

Esta pode ser a maneira preferida (devido à sua simplicidade) de atingir seu objetivo - parece ter sido enterrado nos comentários de outra resposta:

  1. Adicione o seguinte ao seu .emacsarquivo:

    (require 'ox-extra)
    (ox-extras-activate '(ignore-headlines))
    
  2. Use a ignoretag nos títulos que você gostaria de ignorar (sem ignorar o conteúdo)

NOTA: se você estiver usando o ELPA para instalar o modo organizacional, deverá adicionar o repositório do modo organizacional à sua lista de repositórios do ELPA. Veja aqui para mais detalhes. Depois disso, atualize a lista de pacotes ( M-x package-refresh-contents) e instale o org-plus-contribpacote (por exemplo, com M-x package-install). Não se esqueça de se livrar de qualquer instalação antiga do modo organizacional.

Marca
fonte
2
Essa é a resposta correta.
rasmus
Aceitei isso como a resposta, mesmo que não funcione para mim. Tentei carregar o org-extra.el, mas ainda faltava alguma outra função (estou preso à Org 8.2.4).
Brian Z
Não consigo encontrar o pacote ox-extra ...
Toothrot 15/16
11
@ Toothrot está na contrib/lisppasta - consulte orgmode.org/cgit.cgi/org-mode.git/tree/contrib/lisp/ox-extra.el - no seu arquivo de configuração do emacs, pode ser necessário adicionar uma linha como (add-to-list 'load-path "/path/to/contrib/lisp").
Mark
Observe que essas palavras são apenas da org 8.3+. E você não pode simplesmente pegar o ox-extra.el, que possui dependências org 8.3+. Você receberá erros na exportação por não conseguir encontrar os arquivos necessários.
Dodgie
16

Sim , isso é inteiramente possível. Adicione o seguinte código ao seu arquivo init:

(defun org-remove-headlines (backend)
  "Remove headlines with :no_title: tag."
  (org-map-entries (lambda () (delete-region (point-at-bol) (point-at-eol)))
                   "no_title"))

(add-hook 'org-export-before-processing-hook #'org-remove-headlines)

Agradecimentos

Esta pergunta já foi feita no StackOverflow (com um foco e uma redação diferentes, provavelmente é por isso que você não conseguiu localizá-la quando pesquisou na Internet antes de postar aqui). O código acima é uma versão simplificada do código na resposta aceita ; funciona para o novo exportador introduzido na org-mode8.0 e é independente de back-end .

Atualizar

Conforme discutido nos comentários, o código acima faz com que o conteúdo das entradas marcadas com :no_title:desapareça se elas forem precedidas por uma entrada marcada para ser excluída do documento exportado. Por exemplo, a exportação do seguinte documento produzirá um documento com um título e um sumário, mas sem conteúdo:

#+EXCLUDE_TAGS: no_export

* No export                          :no_export:
  This is not meant for you to see.
* No title                           :no_title:
  You should see this.

A razão para isso é que org-moderemove o título marcado :no_title:antes de remover a entrada cujo título está marcado :no_export:. Como resultado, quando se trata de remover a no_exportentrada, trata o conteúdo da no_titleentrada como pertencendo à no_exportentrada anterior . Isso faz todo o sentido, porque não há mais nenhum elemento estrutural (cabeçalho) que separa o conteúdo das entradas originais.

Para resolver esse problema, podemos transferir a responsabilidade pela remoção de no_exportentradas para org-remove-headlines. Dessa forma, garantimos que todas as no_exportentradas sejam excluídas antes que os títulos sejam removidos das no_titleentradas:

(defun org-remove-headlines (backend)
  "Remove headlines with :no_title: tag."
  (org-map-entries (lambda () (let ((beg (point)))
                                (outline-next-visible-heading 1)
                                (backward-char)
                                (delete-region beg (point))))
                   "no_export" tree)
  (org-map-entries (lambda () (delete-region (point-at-bol) (point-at-eol)))
                   "no_title"))

(add-hook 'org-export-before-processing-hook #'org-remove-headlines)
itsjeyd
fonte
Eu tenho usado muito isso, então obrigado! Mas notei um problema ... Se um cabeçalho marcado com no_exportcabeçalho vier logo antes de um marcado no_title, o conteúdo do segundo cabeçalho também não será exportado.
Brian Z
@BrianZ De nada! Os irmãos no_exporte são no_titletítulos (ou seja, eles têm o mesmo número de estrelas principais)? Caso contrário, qual dos dois títulos tem mais estrelas?
itsjeyd
Eles são irmãos. A exportação deste exemplo brinquedo não tem conteúdo em tudo para mim (apenas título, índice etc.) pastebin.com/KaiK9qJm
Brian Z
11
@BrianZ Por si só, org-remove-headlinesé apenas uma função; não ajudará muito se nunca for chamado de qualquer lugar. Então, sim, você ainda precisa avaliar a linha (add-hook 'org-export-before-processing-hook #'org-remove-headlines)para ativar o comportamento correto. Eu provavelmente deveria ter sido explícito sobre isso nas edições da minha resposta original. Quanto aos avisos que você está vendo: Eu não entendo aqueles com baunilha Emacs 24.4 e versão 8.2.10 do Org Mode. Para se livrar do aviso mencionado, você deve tentar (require 'org-agenda)antes de avaliar a add-hooklinha.
itsjeyd
2
Esse recurso também é implementado como contribuição da organização. Ref: orgmode.org/cgit.cgi/org-mode.git/plain/contrib/lisp/...
rudolfo.christ