2010-08-23 4 views
22

Ma question concerne la façon dont un champ de style bibtex est défini dans un fichier bst. Je voudrais que l'exemple suivant soit expliqué, morceau par morceau, pour comprendre ce que chaque morceau fait. J'aimerais être en mesure d'apporter des changements à cet exemple moi-même.Format de style bib pour fichier bibtext bst - expliqué par un exemple

 
FUNCTION {format.eprint} 
{ eprint duplicate$ empty$ 
    'skip$ 
    { "\eprint" 
     archive empty$ 
     'skip$ 
     { "[" * archive * "]" * } 
     if$ 
     "{" * swap$ * "}" * 
    } 
    if$ 
} 
+4

Cela pourrait être une bonne question pour http://tex.stackexchange.com/ –

Répondre

30

La langue BibTeX est un peu complexe: pour une référence complète jeter un oeil à Tame the BeaST. Les choses clés à retenir sont que c'est un langage de pile et qu'il utilise une approche de postfix. Presque toutes les fonctions intégrées suppriment également leur entrée de la pile. Prenant morceau par morceau, la première ligne commence par FUNCTION, ce qui signifie qu'il va définir une nouvelle fonction() pouvant être utilisée ailleurs dans le fichier .bst. Fait important, cette nouvelle fonction ne peut être utilisée que ci-dessous: l'ordre des fonctions dans le fichier .bstest important. Les accolades sont utilisées pour montrer différents arguments: FUNCTION a besoin de deux, le nom de la fonction et le code qui l'implémente. Dans le code, eprint sera un champ. L'utilisation du nom d'un champ ajoute la valeur du champ à la pile (pour l'enregistrement en cours). Nous avons ensuite duplicate$, ce qui duplique l'élément supérieur de la pile. Ceci est une instruction de construction BibTeX, montrée par le terminal $. La pile contiendra donc deux copies de la valeur eprint.

L'instruction suivante est empty$. Cela va tester si l'élément supérieur de la pile est vide et le supprime, d'où la nécessité pour le duplicate$. Le résultat du test est 1 ou 0, qui reste sur la pile. Le premier élément de la pile est maintenant 1 ou 0 et l'élément suivant est la valeur eprint.

Ensuite, vous avez une instruction if$, qui est en postfix et a donc les deux branches avant le if$. Comme la langue est postfixée, ce qui se passe est que le if$ sélectionnera la vraie branche si le premier élément de la pile est 1 et la branche fausse sinon. Cela supprime également le premier élément de la pile. (Si vous voulez le détail réel, les deux branches sont réellement placées sur la pile, et l'instruction if$ supprime alors celle qui convient et laisse le reste du matériau à exécuter.)

La première branche (vraie) lit 'skip$, qui est une instruction «ne rien faire». Les accolades autour d'une seule instruction peuvent être manqués si vous incluez le '. Une autre branche qui est (un peu) plus facile à lire pour les nouveaux utilisateurs serait

FUNCTION {format.eprint} 
{ eprint duplicate$ empty$ 
    { } 
    { "\eprint" 
     archive empty$ 
     { } 
     { "[" * archive * "]" * } 
     if$ 
     "{" * swap$ * "}" * 
    } 
    if$ 
} 

dire simplement en utilisant un ensemble d'accolades vide pour le « rien » (vrai). Donc le but ici est de ne rien faire si le champ eprint était vide.

La branche false commence "\eprint", ce qui place le littéral \eprint en haut de la pile. La partie suivante les place le champ archive sur la pile et fait un autre test pour un champ vide.Si le champ archive est disponible, le code

"[" * archive * "]" * 

placera [ sur la pile puis le joindre à l'élément supérieur de la pile (qui était \eprint): cette opération d'assemblage est ce * fait. La valeur du champ archive est ensuite ajoutée à la pile et jointe, suivie d'une autre ]. Ainsi, le haut de la pile contiendra

\eprint[<archive>] 

(où <archive> est la valeur du champ d'archives) s'il y a quelque chose pour archive donné, et encore juste \eprint autrement.

Enfin, il y a un peu plus de construction de chaînes à faire. Nous avons

"{" * swap$ * "}" * 

qui place d'abord { sur la pile. Ceci est joint sur l'élément supérieur (\eprint ou \eprint[<archive>]) pour donner \eprint{. La fonction swap$ permute les deux premiers éléments de la pile, de sorte que le premier élément est le nom <eprint> (la valeur du champ eprint). Il y a un joint pour faire

\eprint{<eprint> 

suivie d'une addition finale de } à la fin.

Le résultat est que la pile gagnera un élément sur le dessus. Si eprint est vide, il y aura un élément vide sur le dessus de la pile, sinon il va lire

\eprint{<eprint>} 
Questions connexes