TeX, 216 बाइट्स (4 लाइन, 54 अक्षर प्रत्येक)
क्योंकि यह बाइट गिनती के बारे में नहीं है, यह टाइपसेट आउटपुट की गुणवत्ता के बारे में है :-)
{\let~\catcode~`A13 \defA#1{~`#113\gdef}AGG#1{~`#1 13%
\global\let}GFF\elseGHH\fiAQQ{Q}AII{\ifxQ}AEE#1#2#3|{%
I#3#2#1FE{#1#2}#3|H}ADD#1#2|{I#1FE{}#1#2|H}ACC#1#2|{D%
#2Q|#1 }ABBH#1 {HI#1FC#1|BH}\gdef\S#1{\iftrueBH#1 Q }}
इसे ऑनलाइन आज़माएं! (ओवरलीफ़; सुनिश्चित नहीं है कि यह कैसे काम करता है)
पूर्ण परीक्षण फ़ाइल:
{\let~\catcode~`A13 \defA#1{~`#113\gdef}AGG#1{~`#1 13%
\global\let}GFF\elseGHH\fiAQQ{Q}AII{\ifxQ}AEE#1#2#3|{%
I#3#2#1FE{#1#2}#3|H}ADD#1#2|{I#1FE{}#1#2|H}ACC#1#2|{D%
#2Q|#1 }ABBH#1 {HI#1FC#1|BH}\gdef\S#1{\iftrueBH#1 Q }}
\S{swap the a first and last letters of each word}
pwas eht a tirsf dna tasl setterl fo hace dorw
\S{SWAP THE A FIRST AND LAST LETTERS OF EACH WORD}
\bye
आउटपुट:

LaTeX के लिए आपको बस बॉयलरप्लेट की आवश्यकता है:
\documentclass{article}
\begin{document}
{\let~\catcode~`A13 \defA#1{~`#113\gdef}AGG#1{~`#1 13%
\global\let}GFF\elseGHH\fiAQQ{Q}AII{\ifxQ}AEE#1#2#3|{%
I#3#2#1FE{#1#2}#3|H}ADD#1#2|{I#1FE{}#1#2|H}ACC#1#2|{D%
#2Q|#1 }ABBH#1 {HI#1FC#1|BH}\gdef\S#1{\iftrueBH#1 Q }}
\S{swap the a first and last letters of each word}
pwas eht a tirsf dna tasl setterl fo hace dorw
\S{SWAP THE A FIRST AND LAST LETTERS OF EACH WORD}
\end{document}
व्याख्या
TeX एक अजीब जानवर है। सामान्य कोड पढ़ना और समझना यह अपने आप में एक उपलब्धि है। अस्पष्टीकृत TeX कोड को समझना कुछ कदम आगे बढ़ता है। मैं उन लोगों के लिए इसे समझने का प्रयास करूँगा जो TeX को नहीं जानते हैं, इसलिए इससे पहले कि हम यहाँ शुरू करें TeX के बारे में कुछ अवधारणाएँ हैं जिनका अनुसरण करना आसान है।
के लिए (ऐसा नहीं) पूर्ण TeX शुरुआती
इस सूची में सबसे पहले, और सबसे महत्वपूर्ण वस्तु: कोड आयत के आकार में नहीं होता है, भले ही पॉप संस्कृति आपको ऐसा सोचने के लिए प्रेरित कर सकती है ।
TeX एक मैक्रो विस्तार भाषा है। आप एक उदाहरण के रूप में परिभाषित कर सकते हैं \def\sayhello#1{Hello, #1!}और फिर \sayhello{Code Golfists}प्रिंट करने के लिए TeX पाने के लिए लिख सकते हैं Hello, Code Golfists!। इसे एक "undelimited मैक्रो" कहा जाता है, और इसे पहले (और केवल, इस मामले में) को खिलाने के लिए पैरामीटर आप इसे ब्रेसिज़ में संलग्न करते हैं। टीईएक्स उन ब्रेसिज़ को हटा देता है जब मैक्रो तर्क को पकड़ लेता है। आप अधिकतम 9 मापदंडों का उपयोग कर सकते हैं: \def\say#1#2{#1, #2!}तब \say{Good news}{everyone}।
Undelimited मैक्रो की समकक्ष कर रहे हैं, आश्चर्य, सीमांकित लोगों :) आप पिछले परिभाषा एक बालक और अधिक कर सकता है semantical : \def\say #1 to #2.{#1, #2!}। इस मामले में मापदंडों को तथाकथित पैरामीटर पाठ द्वारा पालन किया जाता है । इस तरह के पैरामीटर टेक्स्ट मैक्रो के तर्क #1को सीमांकित करता है ( द्वारा सीमांकित किया जाता है ␣to␣, रिक्त स्थान शामिल हैं, और #2द्वारा सीमांकित है .)। उस परिभाषा के बाद आप लिख सकते हैं \say Good news to everyone., जिसका विस्तार होगा Good news, everyone!। अच्छा लगा, है न? :) हालांकि एक सीमांकित तर्क है ( TeXbook को उद्धृत करते हुए ) "ठीक से नेस्टेड {...}समूहों के साथ टोकन का सबसे छोटा (संभवतः खाली) अनुक्रम जो गैर-पैरामीटर टोकन की इस विशेष सूची द्वारा इनपुट में अनुसरण किया जाता है"। इसका मतलब है कि का विस्तार\say Let's go to the mall to Martinएक अजीब वाक्य का उत्पादन करेगा। इस मामले में आप "छिपाएँ" पहले पूरे करने होंगे ␣to␣साथ {...}: \say {Let's go to the mall} to Martin।
अब तक सब ठीक है। अब चीजें अजीब होने लगीं। जब TeX एक चरित्र (जिसे "वर्ण कोड" द्वारा परिभाषित किया गया है) पढ़ता है, तो यह उस वर्ण को "श्रेणी कोड" (कैटकोड, दोस्तों के लिए) प्रदान करता है :) जो परिभाषित करता है कि उस चरित्र का क्या अर्थ होगा। वर्ण और श्रेणी कोड का यह संयोजन एक टोकन बनाता है ( उदाहरण के लिए यहां पर अधिक )। यहाँ हमारे लिए जो रुचि के हैं वे मूल रूप से हैं:
कैटकोड 11 , जो टोकन को परिभाषित करता है जो एक नियंत्रण अनुक्रम (एक मैक्रो के लिए एक पॉश नाम) बना सकता है। डिफ़ॉल्ट रूप से सभी अक्षर [a-zA-Z] कैटकोड 11 हैं, इसलिए मैं लिख सकता हूं \hello, जो एक एकल नियंत्रण अनुक्रम है, जबकि \he11oनियंत्रण अनुक्रम \heदो वर्णों 1के बाद है, पत्र के बाद o, क्योंकि 1कैटकोड 11 नहीं है। अगर मैं किया \catcode`1=11, उस बिंदु से \he11oएक नियंत्रण अनुक्रम होगा। एक महत्वपूर्ण बात यह है कि जब टीएक्स पहली बार हाथ में चरित्र देखता है, तो कैटकोड्स सेट होते हैं, और इस तरह के कैटकोड जमे हुए होते हैं ... हमेशा के लिए! (नियम और शर्तें लागू हो सकती हैं)
कैटकोड 12 , जो कि अन्य पात्रों में से अधिकांश हैं, जैसे कि 0"!@*(?,.-+/और आगे। वे कम से कम विशेष प्रकार के कैटकोड हैं क्योंकि वे केवल कागज पर सामान लिखने के लिए काम करते हैं। लेकिन हे, जो लेखन के लिए TeX का उपयोग करता है? (फिर से, नियम और शर्तें लागू हो सकती हैं)
कैटकोड 13 , जो नरक है :) वास्तव में। पढ़ना बंद करो और जाओ अपने जीवन से कुछ करो। आप यह नहीं जानना चाहेंगे कि कैटकोड 13 क्या है। कभी शुक्रवार, 13 तारीख के बारे में सुना है? लगता है कि यह कहाँ से इसका नाम मिला! स्वयं के जोखिम पर आगे बढ़ें! एक कैटकोड 13 चरित्र, जिसे "सक्रिय" चरित्र भी कहा जाता है, अब केवल एक चरित्र नहीं है, यह एक मैक्रो ही है! आप इसे परिभाषित कर सकते हैं कि पैरामीटर और विस्तार जैसा कि हमने ऊपर देखा था। आप करने के बाद \catcode`e=13आप लगता है कि आप कर सकते हैं \def e{I am the letter e!}, लेकिन। आप। नही सकता! eअब कोई पत्र नहीं है, इसलिए आपको पता \defनहीं \defहै, यह है \d e f! ओह, एक और पत्र चुनें जिसे आप कहते हैं? ठीक है! \catcode`R=13 \def R{I am an ARRR!}। बहुत अच्छी तरह से, जिमी, यह कोशिश करो! मेरी हिम्मत है कि आप ऐसा करें और Rअपने कोड में लिखें ! यही एक कैटकोड 13 है। मैं शांत हूँ! पर चलते हैं।
ठीक है, अब समूहन के लिए। यह काफी सीधा है। जो भी असाइनमेंट ( \defएक असाइनमेंट ऑपरेशन है, \let(हम इसमें मिल जाएंगे) एक और है) एक ग्रुप में किया जाता है, जो उस ग्रुप के शुरू होने से पहले बहाल किए जाते हैं, जब तक कि असाइनमेंट ग्लोबल नहीं होता। समूह शुरू करने के कई तरीके हैं, उनमें से एक कैटकोड 1 और 2 वर्णों के साथ है (ओह, कैटकोड फिर से)। डिफ़ॉल्ट रूप {से कैटकोड 1, या स्टार्ट-ग्रुप है, और }कैटकोड 2, या एंड-ग्रुप है। एक उदाहरण: \def\a{1} \a{\def\a{2} \a} \aयह प्रिंट 1 2 1। बाहर समूह \aथा 1तो अंदर यह करने के लिए नए सिरे से परिभाषित किया गया था, 2है, और जब समूह समाप्त हो गया है, यह करने के लिए बहाल कर दी गई 1।
\letआपरेशन की तरह एक और काम ऑपरेशन है \def, बल्कि अलग। साथ \defआप को परिभाषित मैक्रो जो सामान के लिए विस्तार होगा, साथ \letआप पहले से ही विद्यमान बातें की प्रतियां पैदा करते हैं। बाद\let\blub=\def ( =वैकल्पिक है) आप के शुरू होने से बदल सकते हैं eकरने के लिए ऊपर catcode 13 आइटम से उदाहरण \blub e{...और है कि एक साथ मजा। या बेहतर, सामान को तोड़ने के बजाय आप ठीक कर सकते हैं (क्या आप उस पर गौर करेंगे!) Rउदाहरण \let\newr=R \catcode`R=13 \def R{I am an A\newr\newr\newr!}:। त्वरित प्रश्न: क्या आप नाम बदल सकते हैं \newR?
अंत में, तथाकथित "स्पेसियस स्पेस"। यह एक वर्जित विषय है, क्योंकि ऐसे लोग हैं जो दावा करते हैं कि TeX - LaTeX स्टैक एक्सचेंज में अर्जित प्रतिष्ठा को "स्पष्ट स्थान" सवालों के जवाब देकर नहीं माना जाना चाहिए, जबकि अन्य पूरी तरह से असहमत हैं। आप किससे सहमत हैं? अपने दांव लगाएं! इस बीच, टीएक्स एक स्थान के रूप में एक लाइन ब्रेक को समझता है। उनके बीच एक लाइन ब्रेक (एक खाली लाइन नहीं ) के साथ कई शब्द लिखने की कोशिश करें। अब %इन लाइनों के अंत में जोड़ें । यह ऐसा है जैसे आप इन अंत स्थानों के "टिप्पणी" कर रहे थे। बस :)
(क्रमबद्ध) कोड ungolfing
आइए उस आयत को किसी चीज़ में बनाते हैं (यकीनन) इसका अनुसरण करना आसान है:
{
\let~\catcode
~`A13
\defA#1{~`#113\gdef}
AGG#1{~`#113\global\let}
GFF\else
GHH\fi
AQQ{Q}
AII{\ifxQ}
AEE#1#2#3|{I#3#2#1FE{#1#2}#3|H}
ADD#1#2#3|{I#2FE{#1}#2#3|H}
ACC#1#2|{D{}#2Q|#1 }
ABBH#1 {HI#1FC#1|BH}
\gdef\S#1{\iftrueBH#1 Q }
}
प्रत्येक चरण की व्याख्या
प्रत्येक पंक्ति में एक एकल निर्देश होता है। आइए एक-एक करके, उन्हें विच्छेदित करें:
{
पहले हम कुछ परिवर्तन (अर्थात् कैटकोड परिवर्तन) स्थानीय रखने के लिए एक समूह शुरू करते हैं ताकि वे इनपुट पाठ को गड़बड़ न करें।
\let~\catcode
मूल रूप से सभी TeX obfuscation कोड इस निर्देश के साथ शुरू होते हैं। डिफ़ॉल्ट रूप से, सादा TeX और LaTeX दोनों में, ~चरित्र एक सक्रिय चरित्र है जिसे आगे उपयोग के लिए मैक्रो में बनाया जा सकता है। और TeX कोड को अजीब बनाने के लिए सबसे अच्छा उपकरण कैटकोड परिवर्तन हैं, इसलिए यह आमतौर पर सबसे अच्छा विकल्प है। अब इसके बजाय \catcode`A=13हम लिख सकते हैं ~`A13( =वैकल्पिक है):
~`A13
अब पत्र Aएक सक्रिय चरित्र है, और हम इसे कुछ करने के लिए परिभाषित कर सकते हैं:
\defA#1{~`#113\gdef}
Aअब एक मैक्रो है जो एक तर्क लेता है (जो एक और चरित्र होना चाहिए)। पहले तर्क के कैटकोड को सक्रिय करने के लिए 13 में बदल दिया जाता है: ~`#113( ~द्वारा प्रतिस्थापित करें \catcodeऔर एक जोड़ें =और आपके पास :) \catcode`#1=13। अंत में यह इनपुट स्ट्रीम में एक \gdef(वैश्विक \def) छोड़ देता है । संक्षेप में, Aएक और चरित्र को सक्रिय बनाता है और इसकी परिभाषा शुरू करता है। चलो यह कोशिश करते हैं:
AGG#1{~`#113\global\let}
AGपहले "सक्रिय" Gकरता है और करता है \gdef, जिसके बाद अगली Gपरिभाषा शुरू होती है। की परिभाषा इसके Gसमान है A, सिवाय इसके कि इसके बजाय \gdefयह एक \global\let(वहाँ एक \gletजैसा नहीं है \gdef) करता है। संक्षेप में, Gएक चरित्र को सक्रिय करता है और इसे कुछ और बनाता है। आइए हम बाद में उपयोग किए जाने वाले दो आदेशों के लिए शॉर्टकट बनाएँ:
GFF\else
GHH\fi
के बजाय \elseऔर \fiहम बस का उपयोग कर सकते हैं Fऔर H। बहुत कम :)
AQQ{Q}
अब हम का उपयोग Aफिर से, एक और मैक्रो निर्धारित करने की Q। उपरोक्त कथन मूल रूप से (कम मोटे भाषा में) है \def\Q{\Q}। यह बहुत दिलचस्प परिभाषा नहीं है, लेकिन इसकी एक दिलचस्प विशेषता है। जब तक आप कुछ कोड, केवल मैक्रो फैलता को तोड़ने के लिए चाहते हो Qहै Qतो यह एक अनूठा मार्कर की तरह काम करता है, खुद को (यह एक कहा जाता है क्वार्क )। \ifxयदि किसी मैक्रो का तर्क इस तरह का है तो आप सशर्त परीक्षण का उपयोग कर सकते हैं \ifx Q#1:
AII{\ifxQ}
तो आप बहुत सुनिश्चित हो सकते हैं कि आपको ऐसा मार्कर मिल गया है। ध्यान दें कि इस परिभाषा में मैंने \ifxऔर के बीच का स्थान हटा दिया है Q। आमतौर पर इससे एक त्रुटि होती है (ध्यान दें कि सिंटैक्स हाइलाइट सोचता है कि \ifxQएक चीज है), लेकिन चूंकि अब Qकैटकोड 13 है यह एक नियंत्रण अनुक्रम नहीं बना सकता है। हालांकि, सावधान रहें, इस क्वार्क का विस्तार न करें या आप अनंत लूप में फंस जाएंगे क्योंकि इसका Qविस्तार होता हैQ जिसका विस्तार Q...
अब चूंकि पूर्वाग्रह समाप्त हो चुके हैं, हम उचित एल्गोरिथ्म में pwas eht सेटरल पर जा सकते हैं। TeX के टोकन के कारण एल्गोरिदम को पीछे की ओर लिखना पड़ता है। ऐसा इसलिए है क्योंकि जब आप एक परिभाषा करते हैं तो TeX वर्तमान सेटिंग्स का उपयोग करते हुए परिभाषा में वर्णों को टोकन (असाइन catcodes) करेगा, उदाहरण के लिए, अगर मैं करता हूं:
\def\one{E}
\catcode`E=13\def E{1}
\one E
आउटपुट है E1, जबकि अगर मैं परिभाषाओं के क्रम को बदलता हूं:
\catcode`E=13\def E{1}
\def\one{E}
\one E
उत्पादन होता है 11। ऐसा इसलिए है क्योंकि Eपरिभाषा में पहले उदाहरण में कैटकोड बदलने से पहले एक अक्षर (कैटकोड 11) के रूप में टोकन दिया गया था, इसलिए यह हमेशा एक पत्र होगा E। दूसरे उदाहरण में, हालांकि, Eपहले सक्रिय किया गया था, और उसके बाद \oneही परिभाषित किया गया था, और अब परिभाषा में कैटकोड 13 शामिल है Eजो कि फैलता है 1।
हालाँकि, मैं इस तथ्य को अनदेखा करूंगा और तार्किक (लेकिन काम नहीं करने वाला) आदेश की परिभाषाओं को फिर से लिखूंगा। निम्नलिखित पैराग्राफ में आप मान सकते हैं कि पत्र B, C, D, और Eसक्रिय हैं।
\gdef\S#1{\iftrueBH#1 Q }
(ध्यान दें कि पिछले संस्करण में एक छोटा बग था, इसमें ऊपर की परिभाषा में अंतिम स्थान नहीं था। मैंने इसे लिखते समय केवल ध्यान दिया। आगे पढ़ें और आप देखेंगे कि हमें मैक्रो को ठीक से समाप्त करने की आवश्यकता क्यों है। )
पहले हम, उपयोगकर्ता के स्तर मैक्रो निर्धारित \S। यह एक मैत्रीपूर्ण (?) सिंटैक्स के लिए एक सक्रिय वर्ण नहीं होना चाहिए, इसलिए gwappins eht सेटरेल के लिए मैक्रो है \S। मैक्रो हमेशा-सच्चे सशर्त के साथ शुरू होता है \iftrue(यह जल्द ही स्पष्ट हो जाएगा क्यों), और फिर Bमैक्रो कॉल करता है ताकि साइट का प्रतिपादन इसे खा न जाए, जैसे मैंने कोड के पिछले संस्करण में किया था)। यह सच है, इसलिए इसका विस्तार होता है और हम साथ रह जाते हैं । TeX हटा नहीं है ()H (जिसे हमने पहले परिभाषित किया था \fi) से मिलान करने के लिए \iftrue। फिर हम स्थूल #1और एक क्वार्क द्वारा पीछा के तर्क को छोड़ देते हैं Q। मान लीजिए हम उपयोग करते हैं \S{hello world}, तो इनपुट स्ट्रीमइस तरह दिखना चाहिए: \iftrue BHhello world Q␣(मैंने अंतिम स्थान को बदल दिया␣\iftrueBHhello world Q␣\fiH) सशर्त के मूल्यांकन के बाद, इसके बजाय इसे वहां तक छोड़ देता है \fi है वास्तव में विस्तार किया। अब Bमैक्रो का विस्तार किया गया है:
ABBH#1 {HI#1FC#1|BH}
Bएक सीमांकित मैक्रो है जिसका पैरामीटर पाठ है H#1␣, इसलिए तर्क जो कुछ भी है Hऔर एक स्थान के बीच है। के विस्तार से पहले इनपुट स्ट्रीम के ऊपर उदाहरण जारी Bहै BHhello world Q␣। Bइसके बाद H, जैसा कि यह होना चाहिए (अन्यथा TeX एक त्रुटि उठाएगा), तो अगला स्थान helloऔर के बीच है world, इसलिए । अंतिम स्थान की आवश्यकता है क्योंकि सीमांकित मैक्रो#1 ही शब्द है hello। और यहां हमें रिक्त स्थान पर इनपुट पाठ को विभाजित करने के लिए मिला। आहा: डी विस्तार Bसे इनपुट स्ट्रीम करने और बदलने वाला से पहले अंतरिक्ष के लिए हटा देगा सब कुछ HI#1FC#1|BHके साथ #1किया जा रहा है hello: HIhelloFChello|BHworld Q␣। ध्यान दें कि एक BHइनपुट पुनरावृत्ति करने के लिए इनपुट स्ट्रीम में एक नया बाद हैBऔर बाद में शब्दों की प्रक्रिया करें। इस शब्द को संसाधित Bकरने के बाद अगले शब्द को संसाधित किया जाता है जब तक कि शब्द-से-संसाधित होना क्वार्क है को तर्क के अंत में एक की आवश्यकता होती है। पिछले संस्करण के साथ (इतिहास संपादित करें देखें) यदि आप उपयोग करते हैं तो कोड गलत व्यवहार करेगा ( s के बीच का स्थान गायब हो जाएगा)।QQB \S{hello world}abc abcabc
ठीक है, इनपुट स्ट्रीम पर वापस जाएं HIhelloFChello|BHworld Q␣:। पहले वहाँ H(\fi ) है कि प्रारंभिक पूरा करता है \iftrue। अब हमारे पास यह है (छद्म कोड):
I
hello
F
Chello|B
H
world Q␣
I...F...Hथिंक वास्तव में एक है \ifx Q...\else...\fiसंरचना। \ifxपरीक्षण जांच करता है कि शब्द (पहले का टोकन) को पकड़ा है Qक्वार्क। अगर ऐसा है वहाँ और कुछ नहीं करने के लिए निष्पादन समाप्त है, अन्यथा क्या रहता है: Chello|BHworld Q␣। अब Cइसका विस्तार किया गया है:
ACC#1#2|{D#2Q|#1 }
का पहला तर्क Cपूर्वव्यापी है, इसलिए जब तक कि यह एक एकल टोकन नहीं होगा, तब तक दूसरी तर्क को सीमांकित किया जाता है |, इसलिए इनपुट स्ट्रीम C( #1=hऔर #2=ello) के विस्तार के बाद है DelloQ|h BHworld Q␣:। सूचना है कि एक और |वहाँ डाल दिया जाता है, और hकी helloउस के बाद डाल दिया है। आधा स्वैपिंग किया जाता है; पहला अक्षर सबसे अंत में है। TeX में एक टोकन सूची के पहले टोकन को पकड़ना आसान है। \def\first#1#2|{#1}जब आप उपयोग करते हैं तो एक साधारण मैक्रो को पहला अक्षर मिलता है \first hello|। आखिरी एक समस्या है क्योंकि TeX हमेशा तर्क के रूप में "सबसे छोटी, संभवतः खाली" टोकन सूची को पकड़ता है, इसलिए हमें कुछ काम-आस-पास चाहिए। टोकन सूची में अगला आइटम है D:
ADD#1#2|{I#1FE{}#1#2|H}
यह Dमैक्रो वर्क-अराउंड में से एक है और यह एकमात्र मामले में उपयोगी है जहाँ शब्द में एक अक्षर है। मान लीजिए कि हमारे बजाय helloथा x। इस मामले में इनपुट स्ट्रीम होगी DQ|x, फिर Dविस्तार होगा (साथ #1=Q, और #2खाली) IQFE{}Q|Hx:। यह I...F...H( \ifx Q...\else...\fi) ब्लॉक के समान है B, जिसमें यह देखा जाएगा कि तर्क क्वार्क है और केवल xटाइप बैठना छोड़ते हुए निष्पादन को बाधित करेगा । अन्य मामलों में ( helloउदाहरण के लिए वापस ), Dका विस्तार (के साथ #1=eऔर #2=lloQ) होगा IeFE{}elloQ|Hh BHworld Q␣:। फिर से, मैक्रो का विस्तार होगा:I...F...H लिए जाँच करेगा, Qलेकिन विफल हो जाएगा और ले\else शाखाE{}elloQ|Hh BHworld Q␣ :। अब इस चीज़ का आखिरी टुकड़ा,E
AEE#1#2#3|{I#3#2#1FE{#1#2}#3|H}
यहाँ पैरामीटर पाठ काफी समान है Cऔर D; पहले और दूसरे तर्क को हटा दिया गया है, और अंतिम एक को सीमांकित किया गया है |। इनपुट स्ट्रीम इस तरह दिखाई देती है: E{}elloQ|Hh BHworld Q␣फिर Eफैलती है ( #1खाली #2=e, और #3=lloQ) के साथ IlloQeFE{e}lloQ|HHh BHworld Q␣:। I...F...Hक्वार्क के लिए एक और ब्लॉक चेक (जो देखता है lऔर लौटता है false) E{e}lloQ|HHh BHworld Q␣:। अब Eफिर से फैलता है ( #1=eखाली #2=l, और #3=loQ) के साथ IloQleFE{el}loQ|HHHh BHworld Q␣:। और फिर से I...F...H। मैक्रो कुछ और पुनरावृत्तियों को करता है जब तक कि Qअंत में नहीं मिलता है और trueशाखा ली जाती है: E{el}loQ|HHHh BHworld Q␣-> IoQlelFE{ell}oQ|HHHHh BHworld Q␣-> E{ell}oQ|HHHHh BHworld Q␣-> -> IQoellFE{ello}Q|HHHHHh BHworld Q␣। अब क्वार्क पाया जाता है और सशर्त का विस्तार होता है:oellHHHHh BHworld Q␣। ओह।
ओह, रुको, ये क्या हैं? सामान्य पत्र? ओह लड़का! अंत में अक्षर पाए जाते हैं और TeX लिखता है oell, फिर इनपुट स्ट्रीम छोड़ते हुए H( \fi) और ( ) कुछ भी नहीं मिला है oellh BHworld Q␣। अब पहले शब्द में पहले और आखिरी अक्षर की अदला-बदली हुई है और आगे जो टीएक्स मिलता है, Bवह है अगले शब्द के लिए पूरी प्रक्रिया को दोहराना।
}
अंत में हमने समूह को वापस वहीं शुरू कर दिया, ताकि सभी स्थानीय कार्य पूर्ववत हो जाएं। स्थानीय कार्य पत्रों की catcode परिवर्तन कर रहे हैं A, B,C , ... जो मैक्रो किए गए थे ताकि वे अपने सामान्य पत्र अर्थ पर लौटने और सुरक्षित रूप से पाठ में इस्तेमाल किया जा सकता है। और बस। अब \Sमैक्रो वापस परिभाषित किया गया है ऊपर के रूप में पाठ के प्रसंस्करण को गति देगा।
इस कोड के बारे में एक दिलचस्प बात यह है कि यह पूरी तरह से विस्तार योग्य है। यही है, आप इसे बिना किसी चिंता के चलती तर्कों में सुरक्षित रूप से उपयोग कर सकते हैं कि यह फट जाएगा। आप यह भी जांच सकते हैं कि एक शब्द का अंतिम अक्षर दूसरे के समान है या नहीं (जो भी कारण से आपको इसकी आवश्यकता होगी) एक \ifजांच में कोड का उपयोग करें:
\if\S{here} true\else false\fi % prints true (plus junk, which you would need to handle)
\if\S{test} true\else false\fi % prints false
क्षमा (शायद बहुत दूर) के लिए खेदजनक व्याख्या। मैंने इसे गैर TeXies के लिए भी यथासंभव स्पष्ट करने की कोशिश की :)
अधीर के लिए सारांश
मैक्रो \Sएक सक्रिय चरित्र के साथ इनपुट को प्रस्तुत करता है Bजो अंतिम स्थान द्वारा सीमांकित टोकन की सूची देता है और उन्हें पास करता है C। Cउस सूची में पहला टोकन लेता है और उसे टोकन सूची के अंत में ले जाता है और Dजो शेष रहता है, उसका विस्तार करता है। Dजाँच करता है कि "क्या रहता है" खाली है, जिस स्थिति में एकल-अक्षर शब्द पाया गया था, तो कुछ भी न करें; अन्यथा फैलता है E। Eटोकन सूची के माध्यम से जब तक यह शब्द में अंतिम अक्षर नहीं मिल जाता है, तब यह पता चलता है कि यह अंतिम अक्षर, शब्द के मध्य के बाद से निकलता है, जिसके बाद टोकन स्ट्रीम के अंत में छोड़ा गया पहला अक्षर होता है C।
Hello, world!हो जाता है,elloH !orldw(एक पत्र के रूप में विराम चिह्न) याoellH, dorlw!(जगह में विराम चिह्न रखने)?