~bzg/emacsfr

4 3

[BibTeX] De Bib vers Org, et vice-versa

Details
Message ID
<9c7584ae5642b9d6da0009560f744979@formats-ouverts.org>
DKIM signature
missing
Download raw message
Bonjour à vous !

Très bonne année 2022-2023 à vous sur cette liste :-) (après le format 
oral du 1er septembre lors de l'Atelier en ligne)

Je continue mon sujet de BibTeX (merci encore à K pour la réponse de 
début juillet) :

- soit un fichier BibTeX (mais "dialecte" BibLaTeX dans le .emacs)
- ledit fichier comporte de nombreux types d'entrée (dont legislation 
par exemple)
- c'est généré via bibtex-mode

- comment passer de ce .bib à un .org ?
- en reprenant les champs du .bib en propriétés, et le TITLE qui devient 
le titre

et de faire l'opération inverse de .org vers.bib. ?

A- il y a org-bibtex (coucou Bastien ;-) ) mais sauf erreur de ma part 
en lisant attentivement, il n'est pas aussi complet en reprenant les 
champs du .bib pour en faire un .org
https://github.com/Malabarba/org-bibtex/blob/master/org-bibtex.el

B- il y a ox-bibtex mais qui n'est pas prévu pour cela si j'ai bien lu 
aussi
https://github.com/yyr/org-mode/blob/master/contrib/lisp/ox-bibtex.el

C- il y aurait Pandoc, mais je n'ai pas explorer

D- il y aurait modifier le org-bibtex

E- il y aurait quelques regexp avec "replace-regexp" (voire les mêmes en 
Lisp) : j'ai un peu regardé et commencé.

Pour finir, un petit exemple pour passer de l'un à l'autre, et 
réciproquement :

@Legislation{superclef,
title = {Article 4}
date  = {2004-06-21}
url   = {https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000000801164}},

* Article 4
:PROPERTIES:
:ENTRY_TYPE: Legislation
:BTYPE: superclef
:DATE: 2004-06-21
:URL: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000000801164
:END:

Merci de votre lecture !
-- 
Thierry Stoehr, des formats ouverts, https://Formats-Ouverts.org
Details
Message ID
<87fsgucftc.fsf@gnu.org>
In-Reply-To
<9c7584ae5642b9d6da0009560f744979@formats-ouverts.org> (view parent)
DKIM signature
pass
Download raw message
Bonjour Thierry,

je ne connais pas de library qui ferait ce que tu souhaites, mais tu
peux éventuellement poser la question sur emacs-orgmode@gnu.org ?

Bonne journée !

-- 
 Bastien
Details
Message ID
<87czbs9zzl.fsf@alekos.net>
In-Reply-To
<9c7584ae5642b9d6da0009560f744979@formats-ouverts.org> (view parent)
DKIM signature
missing
Download raw message
Salut,

Deux trois idées sur ce problème...

> - soit un fichier BibTeX (mais "dialecte" BibLaTeX dans le .emacs)
> - ledit fichier comporte de nombreux types d'entrée (dont legislation
>   par exemple)
> - c'est généré via bibtex-mode
>
> - comment passer de ce .bib à un .org ?
> - en reprenant les champs du .bib en propriétés, et le TITLE qui
>   devient le titre
>
> et de faire l'opération inverse de .org vers.bib. ?

Remarque préliminaire, qui ne fera pas avancer l'affaire... Ce workflow
me semble très complexe pour pas grand chose. Plus concrètement, je ne
vois pas l'intérêt de dupliquer la base de donnée bibliographique (avec
certains types de champ différents de surcroît) ; et ce d'autant plus
qu'avec les fonctionnalités de citation introduites dans org depuis un
an maintenant, on peut tout à faire créer des lien y vers une entrée
bibliographique spécifique. Soit pour l'exemple donné…

> @Legislation{superclef,
> title = {Article 4}
> date  = {2004-06-21}
> url   = {https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000000801164}},
>
> * Article 4
> :PROPERTIES:
> :ENTRY_TYPE: Legislation
> :BTYPE: superclef
> :DATE: 2004-06-21
> :URL: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000000801164
> :END:

…On mettra dans son fichier org, quelque chose du genre:

* Article 4

[cite:@superclef]

Que l'on fera suivre de commentaires et de liens en tout genre, puisque
c'est (j'imagine) l'idée, lorsqu'on tient une bibliographie, en org.

Quelques références pour Org cite:
https://orgmode.org/manual/Citation-handling.html
https://blog.tecosaur.com/tmio/2021-07-31-citations.html#basic-usage

On peut d'ailleurs imaginer d'automatiser l'affaire avec un hook sur
`bibtex-add-entry-hook' ou `bibtex-clean-entry-hook'. Bibtex-mode est
mal documenté, mais plein de ressources.

Cela étant, tout l'intérêt d'emacs, c'est qu'on peut faire comme ça nous
chante, donc je ferme la parenthèse et je reviens au problème posé et
aux pistes. Je ne commente que celles que je connais.

> C- il y aurait Pandoc, mais je n'ai pas explorer

Pandoc ne fait pas cela.

> E- il y aurait quelques regexp avec "replace-regexp" (voire les mêmes
> en Lisp) : j'ai un peu regardé et commencé.

Certes, mais c'est réinventer la roue. Et Emacs a déjà du solide à ce
propos, je pense notamment à un parser de bibliographie qui accepte les
fichiers bib (bibtex ET biblatex), mais aussi le CSL-JSON :
parsebib. C'est d'ailleurs ce qu'utilisent `citeproc-el' et, par
extension, org cite pour exporter les références avec citeproc visiblement.

https://github.com/joostkremers/parsebib

Parsebib transforme un fichier (ou une liste de fichiers) biblio en
table de hachage... Après, il suffit de réorganiser le tout.

Du coup, pour obtenir le passage de bib à org on aurait un truc comme ça
(le code est absolument améliorable, mais c'est plus pour l'idée)

┌────
│ (require 'parsebib)
│ 
│ (defun bib-to-org-bib (filename)
│   (with-temp-buffer
│     (maphash
│      (lambda (key value)
│        (insert (format "* %s
│     :PROPERTIES:
│     :ENTRY_TYPE: %s
│     :BTYPE: %s\n"
│                        (cdr (assoc "title" value))
│                        (cdr (assoc "=type=" value))
│                        key))
│        (dolist (entry value)
│          (unless (or (string= (car entry) "title")
│                      (string= (car entry) "=type=")
│                      (string= (car entry) "=key="))
│            (insert (format "    :%s: %s\n"
│                            (upcase (car entry))
│                            (cdr entry)))))
│        (insert (princ "    :END:\n\n")))
│      (parsebib-parse filename))
│     (write-file (concat (file-name-base filename) "-to-org.org"))))
│ 
│ (bib-to-org-bib "monfichier.bib") ;; Si ma biblio s'appelle "monfichier.bib" bien sûr
│ 
└────

Ça nous créera un fichier "monfichier-to-org.org" qui semble reprendre
la structure demandée.

Maintenant, si on veut faire la manip à l'envers, il va falloir parser
le fichier org. Et pour ça, il suffit d'utiliser l'API Org Element.

https://orgmode.org/worg/dev/org-element-api.html

Après, on prend à peu près les mêmes et on recommence

┌────
│ (require 'bibtex)                       ; juste pour "laver" la biblio finale
│ (defun org-bib-to-bib (filename)
│   ;; On commence par parser le ficher org
│   (let ((org-elem-tree (with-temp-buffer
│                          (insert-file-contents filename)
│                          (org-element-parse-buffer))))
│     (with-temp-buffer
│       (org-element-map org-elem-tree 'headline
│         (lambda (hl)
│           (org-element-map hl 'node-property
│             (lambda (hh)
│               ;; Type de document
│               (when (string= (org-element-property :key hh) "ENTRY_TYPE")
│                 (insert (format "@%s{" (org-element-property :value hh))))
│               ;; Clef
│               (when (string= (org-element-property :key hh) "BTYPE")
│                 (insert (format "%s,\n" (org-element-property :value hh))))
│               ;; On "map" toutes les autres clefs et leurs valeurs
│               (unless (or (string= (org-element-property :key hh) "ENTRY_TYPE")
│                           (string= (org-element-property :key hh) "BTYPE"))
│                 (insert (format "  %s = {%s},\n"
│                                 (downcase (org-element-property :key hh))
│                                 (org-element-property :value hh))))))
│           ;; On récupère le titre qui servait de headline en org et on ferme
│           (insert (format "  title = {%s}\n}\n\n" (org-element-property :raw-value hl)))))
│       ;; On reformatte le buffer
│       (bibtex-reformat)
│       ;; Un petit lavage des entrées selon la config perso
│       (bibtex-map-entries
│        (lambda (key start end)
│          (bibtex-clean-entry nil)))
│       (write-file (concat (file-name-base filename) "-to-bib.bib")))))
│ 
│ (org-bib-to-bib "monfichier-to-org.org")
└────

Ça donne "monfichier-to-org-to-bib.bib"
Là c'est de la soupe de lambda. Je suis certain qu'il y a ici a plein de
personnes habituées à `org-element' qui savent faire bien plus élégant.

J'ai testé ça sur une biblio de 200 entrées et le résultat est
visiblement (je n'ai pas épluché les entrées) convenable. Cela étant je
ne garantis rien, bien sûr. Sans compter que ça ne fait que convertir
des fichiers dans leur intégralité, ce qui est lourd et pas forcément le
but à l'usage.

Bon emacs,
v
Details
Message ID
<58802f58ff92356e53c4d578c358dacc@formats-ouverts.org>
In-Reply-To
<87czbs9zzl.fsf@alekos.net> (view parent)
DKIM signature
missing
Download raw message
Bonjour à vous ! Et à v !

Déjà, merci pour cette réponse ! Qui plus est, détaillée.
Et je réponds donc dedans :

Le 2022-09-18 20:01, v@alekos.net a écrit :
> Salut,
> Deux trois idées sur ce problème...
> 
>> - soit un fichier BibTeX (mais "dialecte" BibLaTeX dans le .emacs)
>> - ledit fichier comporte de nombreux types d'entrée (dont legislation
>>   par exemple)
>> - c'est généré via bibtex-mode
>> 
>> - comment passer de ce .bib à un .org ?
>> - en reprenant les champs du .bib en propriétés, et le TITLE qui
>>   devient le titre
>> 
>> et de faire l'opération inverse de .org vers.bib. ?
> 
> Remarque préliminaire, qui ne fera pas avancer l'affaire... Ce workflow
> me semble très complexe pour pas grand chose. Plus concrètement, je ne

L'idée est de pouvoir utiliser les fonctionnalités de l'un (org) et de 
l'autre (bib) indifféremment, selon le format avec lequel on est le plus 
à l'aise --- ou plus exactement les outils desdits formats.
Mais se contenter d'un seul format est peut-être le plus pertinent.
D'autant que je voyais la transposition Bib/Org plus simple --- un mot à 
bannir, je sais :-)

> vois pas l'intérêt de dupliquer la base de donnée bibliographique (avec
> certains types de champ différents de surcroît) ; et ce d'autant plus

Je me suis mal exprimé : tous les champs passent de l'un à l'autre.

> qu'avec les fonctionnalités de citation introduites dans org depuis un
> an maintenant, on peut tout à faire créer des lien y vers une entrée
> bibliographique spécifique. Soit pour l'exemple donné…
> 
>> @Legislation{superclef,
>> title = {Article 4}
>> date  = {2004-06-21}
>> url   = 
>> {https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000000801164}},
>> 
>> * Article 4
>> :PROPERTIES:
>> :ENTRY_TYPE: Legislation
>> :BTYPE: superclef
>> :DATE: 2004-06-21
>> :URL: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000000801164
>> :END:
> 
> …On mettra dans son fichier org, quelque chose du genre:
> 
> * Article 4
> 
> [cite:@superclef]
> 
> Que l'on fera suivre de commentaires et de liens en tout genre, puisque
> c'est (j'imagine) l'idée, lorsqu'on tient une bibliographie, en org.

Oui c'est un peu l'idée, mais en allant plus loin avec chacun :
- le Org column view avec match pour Org
- le filtrage avec biber et autres outils pour BibTeX/LaTeX

> Quelques références pour Org cite:
> https://orgmode.org/manual/Citation-handling.html
> https://blog.tecosaur.com/tmio/2021-07-31-citations.html#basic-usage

Merci ! Je les avais croisé sans me repencher dessus.

> On peut d'ailleurs imaginer d'automatiser l'affaire avec un hook sur
> `bibtex-add-entry-hook' ou `bibtex-clean-entry-hook'. Bibtex-mode est
> mal documenté, mais plein de ressources.

C'est souvent ce type (!) de court passage qui suscite l'intérêt : « 
mais plein de ressources »... et du coup, lesquelles insoupçonnées qui 
sont là à attendre alors que parfois on réinvente la roue.

> Cela étant, tout l'intérêt d'emacs, c'est qu'on peut faire comme ça 
> nous
> chante, donc je ferme la parenthèse et je reviens au problème posé et
> aux pistes. Je ne commente que celles que je connais.
> 
>> C- il y aurait Pandoc, mais je n'ai pas explorer
> 
> Pandoc ne fait pas cela.

Affaire classée, merci !

>> E- il y aurait quelques regexp avec "replace-regexp" (voire les mêmes
>> en Lisp) : j'ai un peu regardé et commencé.
> 
> Certes, mais c'est réinventer la roue. Et Emacs a déjà du solide à ce
> propos, je pense notamment à un parser de bibliographie qui accepte les

De l'intérêt de maîtriser : le parsage + l'elispage !

> fichiers bib (bibtex ET biblatex), mais aussi le CSL-JSON :
> parsebib. C'est d'ailleurs ce qu'utilisent `citeproc-el' et, par
> extension, org cite pour exporter les références avec citeproc 
> visiblement.
> 
> https://github.com/joostkremers/parsebib
> 
> Parsebib transforme un fichier (ou une liste de fichiers) biblio en
> table de hachage... Après, il suffit de réorganiser le tout.

Dit comme cela, c'est clair... après cela se complique (pour moi) pour 
écrire le code ci-dessous ! :-)

> Du coup, pour obtenir le passage de bib à org on aurait un truc comme 
> ça
> (le code est absolument améliorable, mais c'est plus pour l'idée)
> ┌────
> │ (require 'parsebib)
> │
> │ (defun bib-to-org-bib (filename)
> │   (with-temp-buffer
> │     (maphash
> │      (lambda (key value)
> │        (insert (format "* %s
> │     :PROPERTIES:
> │     :ENTRY_TYPE: %s
> │     :BTYPE: %s\n"
> │                        (cdr (assoc "title" value))
> │                        (cdr (assoc "=type=" value))
> │                        key))
> │        (dolist (entry value)
> │          (unless (or (string= (car entry) "title")
> │                      (string= (car entry) "=type=")
> │                      (string= (car entry) "=key="))
> │            (insert (format "    :%s: %s\n"
> │                            (upcase (car entry))
> │                            (cdr entry)))))
> │        (insert (princ "    :END:\n\n")))
> │      (parsebib-parse filename))
> │     (write-file (concat (file-name-base filename) "-to-org.org"))))
> │
> │ (bib-to-org-bib "monfichier.bib") ;; Si ma biblio s'appelle
> "monfichier.bib" bien sûr
> │
> └────
> Ça nous créera un fichier "monfichier-to-org.org" qui semble reprendre
> la structure demandée.

Il ne reste plus qu'à se pencher sur ce code pour encore plus comprendre 
et progresser ! :-)

> Maintenant, si on veut faire la manip à l'envers, il va falloir parser
> le fichier org. Et pour ça, il suffit d'utiliser l'API Org Element.

Il y a vraiment déjà tout !

> https://orgmode.org/worg/dev/org-element-api.html
> Après, on prend à peu près les mêmes et on recommence
> ┌────
> │ (require 'bibtex)                       ; juste pour "laver" la 
> biblio finale
> │ (defun org-bib-to-bib (filename)
> │   ;; On commence par parser le ficher org
> │   (let ((org-elem-tree (with-temp-buffer
> │                          (insert-file-contents filename)
> │                          (org-element-parse-buffer))))
> │     (with-temp-buffer
> │       (org-element-map org-elem-tree 'headline
> │         (lambda (hl)
> │           (org-element-map hl 'node-property
> │             (lambda (hh)
> │               ;; Type de document
> │               (when (string= (org-element-property :key hh) 
> "ENTRY_TYPE")
> │                 (insert (format "@%s{" (org-element-property :value 
> hh))))
> │               ;; Clef
> │               (when (string= (org-element-property :key hh) "BTYPE")
> │                 (insert (format "%s,\n" (org-element-property :value 
> hh))))
> │               ;; On "map" toutes les autres clefs et leurs valeurs
> │               (unless (or (string= (org-element-property :key hh)
> "ENTRY_TYPE")
> │                           (string= (org-element-property :key hh) 
> "BTYPE"))
> │                 (insert (format "  %s = {%s},\n"
> │                                 (downcase (org-element-property :key 
> hh))
> │                                 (org-element-property :value hh))))))
> │           ;; On récupère le titre qui servait de headline en org et 
> on ferme
> │           (insert (format "  title = {%s}\n}\n\n"
> (org-element-property :raw-value hl)))))
> │       ;; On reformatte le buffer
> │       (bibtex-reformat)
> │       ;; Un petit lavage des entrées selon la config perso
> │       (bibtex-map-entries
> │        (lambda (key start end)
> │          (bibtex-clean-entry nil)))
> │       (write-file (concat (file-name-base filename) 
> "-to-bib.bib")))))
> │
> │ (org-bib-to-bib "monfichier-to-org.org")
> └────
> Ça donne "monfichier-to-org-to-bib.bib"
> Là c'est de la soupe de lambda. Je suis certain qu'il y a ici a plein 
> de
> personnes habituées à `org-element' qui savent faire bien plus élégant.

Moi je trouve cela très bien, même avec les lambda !

> J'ai testé ça sur une biblio de 200 entrées et le résultat est
> visiblement (je n'ai pas épluché les entrées) convenable. Cela étant je
> ne garantis rien, bien sûr. Sans compter que ça ne fait que convertir
> des fichiers dans leur intégralité, ce qui est lourd et pas forcément 
> le
> but à l'usage.
> 
> Bon emacs,
> v

Un grand MERCI pour ces informations précises et précieuses !
Vive Emacs... et vive BibTeX !
-- 
Thierry Stoehr, des formats ouverts, https://Formats-Ouverts.org
Details
Message ID
<42c88d4ebc63c82135dedb914477e1cb@formats-ouverts.org>
In-Reply-To
<87czbs9zzl.fsf@alekos.net> (view parent)
DKIM signature
missing
Download raw message
Bonjour à vous !

J'ai déjà répondu à cette réponse --- merci encore à v !
Mais je me permets de compléter pour partager, et/ou/voire avoir vos 
retours :

Le 2022-09-18 20:01, v@alekos.net a écrit :
> Salut,
> Deux trois idées sur ce problème...
> 
>> - soit un fichier BibTeX (mais "dialecte" BibLaTeX dans le .emacs)
>> - ledit fichier comporte de nombreux types d'entrée (dont legislation
>>   par exemple)
>> - c'est généré via bibtex-mode
>> 
>> - comment passer de ce .bib à un .org ?
>> - en reprenant les champs du .bib en propriétés, et le TITLE qui
>>   devient le titre
>> et de faire l'opération inverse de .org vers.bib. ?
> 
> Remarque préliminaire, qui ne fera pas avancer l'affaire... Ce workflow
> me semble très complexe pour pas grand chose. Plus concrètement, je ne
> vois pas l'intérêt de dupliquer la base de donnée bibliographique (avec

===[J'ai coupé ici pour répondre à ce point qui est le point central]===

Bibtex offre des possibilités et dispose de logiciels qui le manipule.
Orgmode... aussi ! La belle lapalissade.

Alors l'idée est d'avoir le meilleur des 2 mondes car a priori ce qui 
existe dans l'un n'est pas forcément (ou pas facilement) dans l'autre.

Et donc, pouvoir passer de l'un à l'autre, permet d'avoir les 2 mais 
avec une seule source à alimenter/maintenir.

Un cas précis :
- si on relève en Bibtex ses références au sens large (livres, 
articles... mais aussi des films, publicités, documentaires, sites Web, 
catalogues, chansons, pièces de théâtre, séries TV,...) c'est complet 
(voir à compléter), propre et puissant ;
- mais comment générer avec BibTeX/BibLaTeX : (1) des tableaux + (2) 
avec que certains champs + (3) en fonctions de critères sur certains 
champs ?

Si vous pensez « Ah oui, c'est le truc que Thierry a signalé/demandé sur 
la liste pour Org il y a longtemps (et même à l'époque des réunions en 
salle chez Inno3 !) à propos de column view ! », vous avez raison, c'est 
bien moi et c'est bien cela ;-)

L'idée a même été retenue et le code écrit (merci Bastien !) et poussé 
dans Org (merci Bastien) pour avoir cela dans Orgmode depuis la version 
9.2 :
- c'est "column view" avec "match" ("Allow to filter by tags/property 
when capturing colview. You can now use :match to filter entries using a 
todo/tags/properties matcher").

- cela donne un tableau + avec certains champs souhaités à l'affichage 
(la sortie) + avec certains critères dans la sélection (mais pas 
forcément affichés).
Cela peut sembler logique, mais ce n'était pas le cas avant la 9.2 !

Exemple : avoir les livres de 2020 (critère de sélection) en créant un 
tableau avec uniquement titre + éditeur (les 2 critères de sortie).

Et pour faire cela... BibTeX ne fait pas... facilement. Déjà, il fait 
pas de tableaux mais des listes.
Donc il faut créer un nouveau style BibTeX... mais ce n'est pas aussi « 
léger » ni rapide qu'avec Org.

Il y a la commande "latex makebst" pour créer son style de biblio : 
http://gabrielelanaro.github.io/blog/2014/12/01/latex-bibliography-in-5-minutes.html
C'est aussi expliqué dans "Tame the BeaST" de Nicolas Markey à 
http://www.lsv.fr/~markey/BibTeX/doc/ttb_en.pdf
Le document est de 2005... avant Org et ses améliorations.

En résumé, avec ce que je sais et qui est ci-dessus :
- 1 fichier (org ou bib) et on passe de l'un à l'autre pour les 
manipulations disponibles.

Merci de votre lecture ! :-) Et bon Emacs !
-- 
Thierry Stoehr, des formats ouverts, https://Formats-Ouverts.org
Reply to thread Export thread (mbox)