2012-02-03 15 views
9

Quando si utilizza la modalità Org e il suo esportazione in LaTeX, BibTeX o Biblatex vengono spesso utilizzati per gestire i riferimenti. In tal caso, il comando LaTeX \printbibliography è spesso incluso nel file org. \printbibliography viene inserito nel file org in cui LaTeX deve scrivere l'elenco di riferimento. Quello che fa \printbibliography è inserire un'intestazione LaTeX insieme all'elenco dei riferimenti. Nella maggior parte dei casi, \printbibliography viene inserito alla fine del file org semplicemente perché nella maggior parte dei documenti l'elenco di riferimento deve essere inserito per ultimo. Ciò significa che \printbibliography verrà incluso nell'ultima intestazione del file org, ad es.Evita printbibliography ingerito dalle intestazioni della modalità Org

* Heading 

    \printbibliography 

Significa anche che, quando tale voce è piegato sarà inghiottito il \printbibliography:

* Heading... 

Ma questo va contro il senso di \printbibliography perché include la propria voce in uscita. Inoltre, sarà confuso quando \printbibliography viene ingerito e viene inserita una nuova intestazione dopo di essa perché l'elenco di riferimento non verrà più visualizzato per ultimo nel documento.

Come posso fare in modo che \printbibliography non venga inghiottito dalle sezioni in modalità Org? Una domanda bonus: come posso fare in modo che la modalità Org non crei intestazioni dopo lo \printbibliography a meno che non venga premuto C-Ret quando il cursore si trova dopo di esso?

Nella ricerca di una soluzione a questo problema, ho trovato http://comments.gmane.org/gmane.emacs.orgmode/49545.

risposta

1

Quanto segue è leggermente testato ma funziona per me utilizzando la scheda e la scheda Maiusc per nascondere e visualizzare le cose. Quelli sono gli unici comandi di nascondere e mostrare che io uso, quindi se usi altri comandi potrebbero dover essere avvisati o risolti in qualche altro modo.

Ovviamente è possibile cambiare org-footer-regexp in tutto ciò che si desidera. Speravo di non dover usare alcun consiglio, ma senza avvisare org-end-of-subtree l'ultima intestazione non passa mai in rassegna con la scheda perché pensa che non sia nascosta, quindi la nasconde e quindi la visualizza org-cycle-hook. Chiama org-end-of-subtree prima di eseguire org-pre-cycle-hook quindi non è nemmeno un'opzione.

(defvar org-footer-regexp "^\\\\printbibliography\\[.*\\]$" 
    "Regexp to match the whole line of the first line of the footer which should always be shown.") 

(defun show-org-footer (&rest ignore) 
    (save-excursion 
    (goto-char (point-max)) 
    (when (re-search-backward org-footer-regexp nil t) 
     (outline-flag-region (1- (point)) (point-max) nil)))) 

(add-hook 'org-cycle-hook 'show-org-footer) 
(add-hook 'org-occur-hook 'show-org-footer) 

(defadvice org-end-of-subtree (after always-show-org-footer 
            () 
            activate) 
    (when (>= (point) (1- (point-max))) 
    (re-search-backward org-footer-regexp nil t) 
    (setq ad-return-value (point)))) 
+0

Questo sembra funzionare anche per me per tab e shift-tab. Lo fa, come sottintende, non funziona con alberi sparsi. Può essere fatto per lavorare con alberi sparsi? –

+0

Sì, sembra che aggiungerlo a "org-occurr-hook" fa il trucco. –

+0

Come puoi leggere nel [manuale biblatex] (http://mirror.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf) '\ printbibliography' prende gli argomenti nella forma' \ printbibliography [tasto = value, ...] 'e, quindi, per rendere la tua risposta ancora migliore potresti voler modificare 'org-footer-regexp' per consentire a' \ printbibliography' di essere seguito da '[', any characters, '] '. –

1

Una soluzione potrebbe essere la seguente:

#+macro: printbiblio  (add extra spaces here, but cannot add comment) 

* Test 2 
    This is a test 

* {{{printbiblio}}} 
    Test text 
    \printbibliography 
* 
    asdf 

come non si finisce con un titolo vuoto nella parte inferiore del documento. La macro si espande a un blocco vuoto di testo in modo si finisce con

\section{Test 2} 
\label{sec-1} 

This is a test 
\section{} 

Test text 
\printbibliography 
\section{} 

asdf 

Questo assicura, inoltre, non è possibile aggiungere accidentalmente titoli dopo la bibliografia, dal momento che è il proprio titolo (vuoto). Potrebbe essere (sembra essere in realtà) incluso nel sommario, il che è sfortunato, ma sospetterei che la soluzione sarebbe nel peggiore dei casi una post-esportazione per rimuovere il titolo vuoto dal file (o farlo manualmente prima di convertirlo in PDF).

+1

Con ciò, come si nota, '* {{{printbiblio}}}' diventa '\ section {}' e '*' diventa '\ section {}'. LaTeX tratta '\ section' con un argomento vuoto come una sezione, e quindi il tuo test case produce una sezione senza un nome prima di' \ printbibliography' e una sezione senza un nome dopo di essa. Quello che vorrei è che '\ printbibliography' non sia inghiottito da un'intestazione org e che l'org non esporti in modo che lo metta sotto un'intestazione perché in LaTeX produrrà la propria intestazione. –

+0

Questo mi ha dato un'idea per la domanda di @NN sui commenti in linea: http://stackoverflow.com/questions/9212737/how-to-make-inline-comments-in-org-mode/9307681#9307681 Spero che tu non importa - ho votato questa risposta. –

+0

Non è un problema, non avevo pensato di usarlo in quel modo per quell'altra domanda. –

3

Una soluzione per questo problema è quello di rendere \printbibliography non ritorno un'intestazione lattice così che esso possa essere adeguatamente posto sotto un'intestazione Org-mode.

Con biblatex è possibile fornire \printbibliography con l'opzione heading=none e posizionarlo in una voce appropriata.Ecco un esempio:

* Heading 

* References 

    \printbibliography[heading=none] 

In questo modo i riferimenti possono essere tenuti in un titolo a sé stante e \printbibliography di essere inghiottito da un titolo non è un problema perché viene inghiottito da una propria rubrica.

+0

Si noti che se la numerazione delle sezioni è sull'intestazione References avrà anche un numero .. Ho scritto una [risposta] (http://stackoverflow.com/a/27165105/1346426) che gestisce anche questo caso. –

0

Un'altra soluzione sarebbe quella di mettere la bibliografia in una rubrica denominata "Riferimenti" in questo modo:

* Heading 
Some text 
* References 
\printbibliography 

e rimuovere il \section{References} dal file lattice risultante aggiungendo questo ai vostri emacs init presentare

(defun org-export-latex-remove-references-heading (contents backend info) 
    (if (not (eq backend 'latex)) 
     contents 
     (replace-regexp-in-string "\\\\section\\*?{References}\\s-*\\\\label{.*?}" "" contents) 
    )) 

(add-hook 'org-export-filter-final-output-functions 'org-export-latex-remove-references-heading) 

Si noti che si presume che si abbia solo un'intestazione denominata "Riferimenti", in quanto sostituisce tutte le occorrenze di. Si assume anche le sezioni sono in questo formato:

\section{References} 
\label{<any_string>} 
\printbibliography 

Per altri formati è necessario modificare l'espressione regolare nella funzione org-export-latex-remove-references-heading.

0
* References 
    :PROPERTIES: 
    :UNNUMBERED: t 
    :END: 

    \printbibliography[heading=none] 

C'è un modo più semplice per risolvere questo. Basta aggiungere una proprietà "non numerata" all'intestazione e verrà esportata senza alcuna numerazione.