piątek, 18 września 2009

Manipulowanie plikami bibtexa

Konwencję sobie przyjąłem, że pole tp:keywords zawiera moje słowa kluczowe. Czemu tak? Ano temu, że moja baza bibtexa zawiera wpisy skopiowane z różnych repozytoriów; wpisy te zawierają pole keywords, tyle że nie ma żadnych reguł odnośnie tego co jest zawartością tego pola. Zawartość pola tp:keywords jest (przynajmniej w założeniu) słownikiem ustalonym (controlled vocabulary) pojęć. Podobnie pole tp:comment zawiera mój, krótki opis zawartości pozycji bibliograficznej. W szczególności pola te pomagają posortować/wyciągnąć pozycje bibliograficzne, relewantne z punktu widzenia określonej dziedziny zastosowań. Używam do tego narzędzia bibtool:


bibtool -- 'select {tp:keywords "OSS" }' tph.bib

Powyższe oznacza: wypisz wszystkie rekordy z pliku tph.bib, które zawierają napis OSS w polu tp:keywords. Napis "OSS" jest traktowany jako wyrażenie regularne (regex 0.12):


bibtool -- 'select {tp:keywords "OSS\|UTAUT" }' tph.bib

Powyższe oznacza: wypisz wszystkie rekordy z pliku tph.bib, które zawierają napis OSS lub napis UTAUT w polu tp:keywords. Wyrażenie regularne może zawierać inne metaznaki: ., +, *, itd. Jest znak sumy (a lub b) ale nie ma iloczynu (a i b). Jeżeli chcemy wyciągnąć rekordy zawierająca łącznie pewne napisy, to można wykorzystać mechanizm potoku:


bibtool -- 'select {tp:keywords "#Prio" }' tph.bib |\
bibtool -- 'select {tp:keywords "OSS" }' | \
bibtool -- 'select {tp:keywords "SEM" }'

Powyższe oznacza: wypisz wszystkie rekordy z pliku tph.bib, które zawierają napisy OSS, SEM oraz #Prio (w dowolnym porządku) w polu tp:keywords. Słowo kluczowe #Prio to moja konwencja na oznaczenie ważnych wpisów. Innymi słowy powyższe oznacza: wypisz ważne pozycje literatury dotyczące (łącznie) OSS i SEM.

Do zamiany plików bibtexa na xhtml używam narzędzia bib2xhtml. Ten pakiet jest niestandardowy -- z tego co pamiętam -- trzeba go ściągnąć i zainstalować samodzielnie...

Moja baza bibtexa zawiera kilkaset wpisów, dotyczących różnych dziedzin i o różnym stopniu ważności (od merytorycznie istotnych do słabych; słabe też trzeba gromadzić--np. jako przykłady). Stąd powyższe pomysły, żeby trochę nad tym wszystkim zapanować...

Modyfikując bib2xhtml, który jest programem napisanym w Perlu, zmarnowałem trochę czasu usiłując dodać konwersję (brakujących) polskich znaków diakrytycznych. Otóż bib2xhtml zakłada iż plik jest kodowany w notacji LaTeXa (7 bitowe ASCII), przy czym nie są zaimplementowane znaki zawierające ogonek. Proste wpisanie:


s/\\k\{a\}/ą/g;

Nie chciało zadziałać. Po bliższym obejrzeniu skryptu się okazało, że każdy wiersz pliku jest wstępnie zamieniany poprzez wykonanie następującego polecenia:


## fragment jest wykonywany wew. pętli, `iterującej' po wszystkich wierszach pliku:
{ local ($c, $l, $z) = (0, 0, ());
s/([\{\}])/join("","\001",($1 eq "\{" ? $z[$l++]=$c++ : $z[--$l]),$1)/ge;
## ge oznacza, globalnie+extended mode, dzięki czemu powyższe ma charakter pętli
## wykonywanej dla każdego znaku { oraz }
}

W rezultacie każda sekwencja {...} zostanie zamieniona na \nnn{...\nnn}, gdzie \nnn jest znakiem o kodzie nnn. Przykładowo jeżeli wiersz zawiera:


{abc} {def} {ghi} jkl... => \001{abc\001} \002{def\002} \003{ghi\003} jkl...

Dzięki czemu każda para { ... } jest teraz jednoznacznie identyfikowana. Dokładnie nie wiem po co jest taka sztuczka robiona. Ale teraz zamiana przykładowo \k{a}, tj.~polskiego ą w notacji LaTeXa, wymaga zapisu:


s/\\k(\001\d+)\{a\1\}/ą/g;

Brak komentarzy:

Prześlij komentarz