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␣
(मैंने अंतिम स्थान को बदल दिया␣
\iftrue
BHhello world Q␣
\fi
H
) सशर्त के मूल्यांकन के बाद, इसके बजाय इसे वहां तक छोड़ देता है \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 के बीच का स्थान गायब हो जाएगा)।Q
Q
B
\S{hello world}abc abc
abc
ठीक है, इनपुट स्ट्रीम पर वापस जाएं 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!
(जगह में विराम चिह्न रखने)?