2010-08-23 6 views
22

मेरा प्रश्न बीबीटी फ़ाइल में बिबटेक्स-शैली फ़ील्ड को परिभाषित करने के तरीके के बारे में है। मैं नीचे दिए गए उदाहरण को टुकड़ा द्वारा टुकड़ा समझाऊंगा, यह समझने के लिए कि प्रत्येक टुकड़ा क्या कर रहा है। मैं खुद को उस उदाहरण में बदलाव करने की स्थिति में होना चाहता हूं।बिबटेक्स्ट बीएसटी फ़ाइल के लिए बिब-स्टाइल प्रारूप- उदाहरण के अनुसार

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

पढ़ा जाएगा यह http://tex.stackexchange.com/ के लिए एक अच्छा सवाल हो सकता है –

उत्तर

30

BibTeX भाषा थोड़ा जटिल है: एक पूर्ण संदर्भ के लिए Tame the BeaST पर एक नज़र डालें। याद रखने के लिए महत्वपूर्ण चीजें यह है कि यह एक स्टैक भाषा है और यह एक पोस्टफिक्स दृष्टिकोण का उपयोग करती है। लगभग सभी अंतर्निहित फ़ंक्शंस भी स्टैक से अपना इनपुट हटा देते हैं।

टुकड़ा द्वारा यह टुकड़ा ले रहा है, पहली पंक्ति FUNCTION साथ शुरू होता है, जिसका अर्थ है कि यह एक नई समारोह (format.eprint) कि .bst फ़ाइल में कहीं और इस्तेमाल किया जा सकता परिभाषित करेगा। महत्वपूर्ण बात यह है कि, इस नए फ़ंक्शन का उपयोग केवल नीचे ही किया जा सकता है: .bst फ़ाइल में फ़ंक्शंस का क्रम महत्वपूर्ण है। ब्रेसिज़ का उपयोग विभिन्न तर्क दिखाने के लिए किया जाता है: FUNCTION को दो की आवश्यकता होती है, फ़ंक्शन का नाम और कोड जो इसे लागू करता है।

कोड में ही, eprint एक फ़ील्ड होगा। किसी फ़ील्ड के नाम का उपयोग करके फ़ील्ड का मान स्टैक में (वर्तमान रिकॉर्ड के लिए) जोड़ता है। हमारे पास duplicate$ है, जो स्टैक पर शीर्ष आइटम को डुप्लिकेट करता है। यह एक बिबटेक्स बिल्ड-इन निर्देश है, जो टर्मिनल $ द्वारा दिखाया गया है। तो ढेर में अब eprint के मान की दो प्रतियां होंगी।

अगला निर्देश empty$ है। यह जांच करेगा कि स्टैक का शीर्ष आइटम खाली है और इसे हटा देता है, इसलिए duplicate$ की आवश्यकता है। परीक्षण का नतीजा 1 या 0 है, जो ढेर पर छोड़ा गया है। तो ढेर पर शीर्ष आइटम अब या तो 1 या 0 है, और अगला आइटम eprint का मान है।

इसके बाद आप एक if$ बयान है, जो पोस्टफ़िक्स में है और इसलिए दो शाखाओं if$ से पहले है। चूंकि भाषा पोस्टफिक्स है, तो क्या होता है कि if$ स्टैक पर शीर्ष आइटम 1 और अन्यथा झूठी शाखा है, तो if$ सही शाखा का चयन करेगा। यह ढेर से शीर्ष आइटम को भी हटा देता है। (आप वास्तविक विस्तार चाहते हैं, वास्तव में दो शाखाओं ढेर पर रखा जाता है, और if$ बयान तब उपयुक्त एक दूर करता है और छोड़ देता है सामग्री के बाकी निष्पादित किया जाना है।)

पहले (सही) शाखा पढ़ता 'skip$, जो 'कुछ भी नहीं' निर्देश है। यदि आप अग्रणी ' शामिल करते हैं तो एक भी निर्देश के चारों ओर ब्रेसिज़ को याद किया जा सकता है। एक विकल्प है जो (थोड़ा) पढ़ने में आसान नए उपयोगकर्ताओं के लिए

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

अर्थात होगा बस 'कुछ भी नहीं' (सही) शाखा के लिए ब्रेसिज़ के एक खाली सेट का उपयोग कर। तो यहां लक्ष्य कुछ भी नहीं करना है यदि eprint फ़ील्ड खाली था।

झूठी शाखा "\eprint" शुरू होती है, जो स्टैक के शीर्ष पर शाब्दिक \eprint रखेगी। अगले भाग में वे archive फ़ील्ड को स्टैक पर रखता है और खाली फ़ील्ड के लिए एक और परीक्षण करता है।यदि archive क्षेत्र उपलब्ध है, कोड

"[" * archive * "]" * 

तो ढेर पर [ स्थापित करेंगे ढेर (जो \eprint था) पर शीर्ष मद से इसमें शामिल होने: इस में शामिल होने के आपरेशन क्या * करता है। archive फ़ील्ड का मान तब स्टैक में जोड़ा जाता है और उसके बाद ] पर जोड़ा जाता है। तो ढेर के शीर्ष में शामिल होंगे

\eprint[<archive>] 

(जहां <archive> संग्रह फ़ील्ड का मान) अगर वहाँ archive के लिए दिए गए कुछ भी है, और अभी भी सिर्फ \eprint अन्यथा।

अंत में, कुछ और स्ट्रिंग-बिल्डिंग करने के लिए है। हमारे पास

"{" * swap$ * "}" * 

जो पहले स्थान पर { रखता है। \eprint{ देने के लिए यह शीर्ष आइटम (\eprint या \eprint[<archive>]) पर शामिल हो गया है। swap$ फ़ंक्शन स्टैक पर शीर्ष दो आइटम स्वैप करता है, इसलिए शीर्ष आइटम का नाम <eprint> है (eprint फ़ील्ड का मान)। वहाँ

\eprint{<eprint> 

अंत करने के लिए } के अंतिम अलावा द्वारा पीछा करने के लिए एक संयुक्त है।

परिणाम यह है कि स्टैक शीर्ष पर एक आइटम प्राप्त करेगा। यदि eprint खाली है वहाँ ढेर के शीर्ष पर एक खाली आइटम हो जाएगा, अन्यथा यह

\eprint{<eprint>}