TeX / LaTeX में गोल्फ के लिए टिप्स


28

TeX / LaTeX में गोल्फ के लिए लोगों के पास क्या सुझाव हैं? कृपया प्रति उत्तर एक टिप पोस्ट करें, प्रत्येक कम से कम कुछ विशेष TeX / LaTeX के लिए।


संदर्भ: मैंने इस जवाब पर गौर किया और कहा कि TeX / LaTeX के लिए कोई सुझाव प्रश्न नहीं है, इसलिए मैं इसे बना रहा हूं। TikZ में गोल्फिंग के लिए संकरे प्रश्न युक्तियों के साथ कुछ ओवरलैप हैं (क्योंकि TeX / LaTeX के शीर्ष पर TikZ एक विशिष्ट मैक्रो पैकेज है): इस प्रश्न के उत्तर शायद वहां भी लागू होंगे, लेकिन दूसरे तरीके से नहीं।


आप एक गैर-प्रोग्रामिंग भाषा को कैसे गोल्फ कर सकते हैं?
द ग्रेट डक

1
@TheGreatDuck बहुत खराब :-)
ShreevatsaR

@TheGreatDuck वास्तव में, टेक्स है एक प्रोग्रामिंग भाषा, यहां तक कि आम तौर पर अगर यह केवल एक टंकण एक के रूप में प्रयोग किया जाता है।
gvgramazio

जवाबों:


15

प्रलेखित लोगों के बजाय आंतरिक लाटेकस मैक्रोज़ पर विचार करें

उदाहरण के लिए, \romanएक दस्तावेज LaTeX मैक्रो है जो LaTeX काउंटर पर काम करता है। चालू करने के लिए 42में XLIVआप की तरह कुछ का उपयोग करना होगा

\newcounter{z}
\setcounter{z}{42}
\roman{z}

इसके बजाय, यह देखते हुए कि कैसे \romanकार्यान्वित किया जाता है ( \show\romanस्रोत फ़ाइलों को पढ़ने के बजाय, इसे अंतःक्रियात्मक रूप से प्राप्त करने के लिए उपयोग करें), कोई यह देख सकता है कि इसे एक उपयोगी मैक्रो के संदर्भ में लागू किया गया है \@roman, और इसके बजाय सीधे उपयोग करें:

\catcode`@11
\@roman{42}

\catcode`@11लेखन का गोल्फ का तरीका है \makeatletter(LaTeX में साफ रास्ता) या \catcode`\@=11(सादे TeX में साफ तरीका)। इसकी शुरुआत में केवल एक बार ज़रूरत होती है, इसके बाद आप स्थूल नामों का उपयोग कर सकते हैं @


13

~एक मैक्रो के रूप में इस्तेमाल किया जा सकता है (अन्य सक्रिय पात्रों के रूप में)

उदाहरण

पहले:

\def\a{...some definition...} ... use \a...

बाद:

\def~{...some definition...} ... use ~...

स्पष्टीकरण : आम तौर पर TeX में मैक्रो "नियंत्रण अनुक्रम" हैं: आप परिभाषित \somethingया कर सकते हैं \a। लेकिन आप एक सक्रिय चरित्र का उपयोग करके भी कम जा सकते हैं। एकमात्र सक्रिय चरित्र जो डिफ़ॉल्ट रूप से मौजूद है (सादे TeX / LaTeX में) ~("संबंधों" के लिए उपयोग किया जाता है, अर्थात \penalty \@M \सादे TeX (एक स्थान के बाद 10000 का दंड) और \nobreakspace {}LaTeX के रूप में परिभाषित किया गया है )। लेकिन आपको जो भी उद्देश्य की आवश्यकता होती है, उसे फिर से परिभाषित करने से कुछ भी नहीं रोकता है।

इसके अलावा : आप \active(13) को इसकी कैटकोड सेट करके किसी अन्य चरित्र के साथ भी ऐसा कर सकते हैं । उदाहरण के लिए, Zएक सक्रिय चरित्र बनाने पर 12 बाइट्स की "लागत" होती है \catcode`Z13:। फिर आप Zमैक्रो की जगह हर जगह का उपयोग कर सकते हैं \z। कुछ वर्णों के लिए जो एक विशेष अर्थ के साथ शुरू होते हैं, प्रत्यक्ष बैकटिक दृष्टिकोण काम नहीं करता है और आपको एक और चरित्र की आवश्यकता है: \catcode`\Z13या \catcode90=13


9

\def निश्चित पैटर्न से मेल कर सकते हैं

मान लीजिए कि आपके पास था \def\a #1 #2 {...some definition here...}। फिर जब आप इसे एक स्ट्रिंग पर कहते हैं जैसे \a Act42, Scene26, मैक्रो के अंदर तर्कों को # 1 <- Act42,, # 2 <- जैसे सौंपा जा सकता है Scene26और फिर आपको संबंधित भागों को निकालने के लिए कुछ और काम करना होगा। इसके बजाय, कोई भी सीधे लिख सकता है

\def\a Act#1, Scene#2 {...some definition here...}

और फिर इसे कॉल करके \a Act42, Scene26सीधे # 1 <- 42और # 2 <- सेट किया जाएगा 26

(यह मूल रूप से की परिभाषा है \def, लेकिन यह भूलना आसान है क्योंकि आमतौर पर यह LaTeX में ऐसा नहीं करता है, तर्कों को पारित करने के लिए पसंद करते हैं {}जैसे कि वे फ़ंक्शन कॉल थे।)


8

सादे TeX और LaTeX के बीच चयन

इस बारे में बहुत कुछ कहा जा सकता है, लेकिन संक्षेप में, एक विशिष्ट सादे TeX दस्तावेज़ की तुलना करें जो उसी के लिए एक विशिष्ट LaTeX दस्तावेज़ के साथ "हैलो" प्रिंट करता है:

Hello
\bye

बनाम

\documentclass{article}
\begin{document}
Hello
\end{document}

LaTeX (wrt कोड गोल्फ) की "लागत" स्पष्ट है; बेशक "लाभ" यह है कि LaTeX कई पूर्व लिखित मैक्रोज़ और पैकेजों की एक लाइब्रेरी के साथ आता है, जिनमें से कुछ हाथ में काम के लिए उपयोगी हो सकते हैं।


मैं लाटेक्स का उपयोग करने के कारण अटक गया था \@Roman(सादे में काम करने के लिए अपरकेस प्राप्त करने के लिए बहुत सारे बाइट्स खर्च होंगे) - लेकिन सादा टीएक्सएक्स अक्सर छोटा होगा।
क्रिस एच

8

\input ... से छोटा है \usepackage{...}

उदाहरण के लिए, आप लिख सकते हैं

\input color

के बजाय

\usepackage{color}

जो 6 कम बाइट्स है।


8
हालांकि यह इंगित करना उपयोगी है कि \usepackageआपके द्वारा शामिल पैकेजों की संख्या अधिक प्रभावी हो जाती है। चूंकि आप केवल एक \usepackageबयान के साथ एक से अधिक पैकेज का उपयोग कर सकते हैं , लेकिन \inputप्रत्येक पैकेज के लिए आवश्यक है , यदि आप 3 या अधिक पैकेज का उपयोग कर रहे हैं, \usepackageतो बेहतर विकल्प बन जाता है।
गेहूं जादूगर

7

यदि LaTeX का उपयोग कर रहे हैं, तो एक शॉर्ट का उपयोग करेंdocumentclass ( क्रिस एच द्वारा विचार )

ठेठ के साथ शुरू करने के बजाय

\documentclass{article}

कोई bookभी या जैसी भी छोटी दस्तावेज़ कक्षाएं चुन सकता है

\documentclass{ecv}

या

\documentclass{tui}

आपको सवाल के चश्मे के भीतर रहना याद रखना चाहिए, articleडिफ़ॉल्ट रूप से इसके पृष्ठों को, यह अतिरिक्त आउटपुट माना जा सकता है। शायद एक मेटा प्रश्न यह निर्धारित करने के लिए है कि दस्तावेज़ वर्गों को क्या अनुमति दी जानी चाहिए।
गेहूं जादूगर

@HeatWizard अच्छा बिंदु। मुझे लगता है कि यह अलग-अलग सवाल हो सकता है कि क्या पेज नंबर को अतिरिक्त आउटपुट माना जाता है।
श्रीवत्सआर

मुझे लगता है कि एक न्यूनतम वर्ग एक अच्छा विचार होगा - एक एकल अक्षर का नाम और कोई पृष्ठ क्रमांक नहीं
क्रिस एच

मैंने एक साथ रखा है g.clsजो सिर्फ article.clsसाथ है, \pagenumbering{gobble}लेकिन जैसा कि गितुब नीचे है मैं इसे अभी के लिए नहीं रख सकता हूं
क्रिस एच


7

एक वातावरण बनाने के लिए कहा जाता myenvironmentहै कमांड \myenvironmentऔर उत्पन्न करता है \endmyenvironment। इनका उपयोग आंतरिक रूप से पर्यावरण को शुरू करने और समाप्त करने के लिए किया जाता है। कुछ मामलों में उन्हें शॉर्टकट के रूप में इस्तेमाल किया जा सकता है। उदाहरण के लिए, के बजाय

\begin{itemize}
\item abc
\end{itemize}

कोई भी कर सकता है

\itemize
\item abc
\enditemize

समर्थित नहीं है, विश्वसनीय नहीं है, सभी मामलों में काम नहीं करता है, अपने जोखिम पर उपयोग करें, आदि।


साइट पर आपका स्वागत है!
डीजेएमकेम

3
आप अक्सर \itemize{...}अधिक बचत के लिए भी कर सकते हैं ।
गेहूं जादूगर

4

\usepackage{packagea,packageb,packagec} काम करता है, इसलिए जब तक आप संकुल को विकल्प नहीं दे रहे हैं।


4

लाइनों को एक साथ चलाएं। कई लंबी-फ़ॉर्म वाली भाषाओं की तुलना में, LaTeX / TeX में लाइन ब्रेक की शायद ही कभी आवश्यकता होती है।


3

कुछ मैक्रोज़ जिनसे आपको ब्रेसिज़ की आवश्यकता हो सकती है, उनके तर्कों को वास्तव में गोल नहीं करना चाहिए, खासकर जब एक और मैक्रो के साथ उपयोग किया जाता है #1 -स्टाइल तर्कों के है।

यदि तर्क में एक से अधिक टोकन (वर्ण या नियंत्रण अनुक्रम) हों तो अधिकांश मैक्रोज़ को केवल ब्रेसिज़ की आवश्यकता होती है।

\mymacro1          % equivalent to \mymacro{1}
\mymacro{12}       % equivalent to \mymacro{12}
\mymacro a         % equivalent to \mymacro{a}
\mymacro{ab}       % equivalent to \mymacro{ab}
\mymacro\foo       % equivalent to \mymacro{\foo}
\mymacro{\foo x}   % equivalent to \mymacro{\foo x}

3

यदि आपको कई बार लंबे नाम के साथ एक ही मैक्रो का उपयोग करने की आवश्यकता है, तो आप \letएक छोटे उपनाम को परिभाषित करने के लिए उपयोग कर सकते हैं ।

\let\a\mymacrowithalongname
\a{foo}\a{bar}\a{qux}

यह दो बाइट्स को बचाता है \def\a{\mymacrowithalongname} , अगर आपको परिभाषा में कई टोकन की आवश्यकता नहीं है।

मैक्रो नाम के बजाय, बैकस्लैश पर सहेजने के लिए आपके पास एक सक्रिय चरित्र हो सकता है।

ध्यान दें कि \letकेवल स्थूल नामों से ही नहीं, बल्कि अंतर्निहित प्राइमेट के साथ भी काम करता है। उदाहरण के लिए, यदि आप \ifnum ... \fiअपने कोड में बहुत सारे निर्माणों का उपयोग करते हैं, तो परिभाषित करते हैं \let\i\ifnumऔर इसके बजाय \i ... \fiआप कुछ बाइट्स बचा सकते हैं। यह भी \letखुद के लिए काम करता है \let\l\let:।


3

स्थानीय {... }समूहों का बुद्धिमानी से उपयोग करें

जैसा कि इस उत्तर में बताया गया है , जैसे सक्रिय वर्णों का ~उपयोग स्थूल नाम के रूप में किया जा सकता है। दुर्भाग्य से, ~डिफ़ॉल्ट रूप से एकमात्र सक्रिय चरित्र है, और किसी अन्य वर्ण के लिए कैटकोड बदलना महंगा है: \catcode`!1312 बाइट्स लेता है। यदि नई मैक्रो परिभाषा केवल आपके कोड के एक छोटे से क्षेत्र में आवश्यक है, तो स्थानीय समूह एक समाधान हो सकते हैं।

जब TeX द्वारा खोले गए एक नए स्थानीय समूह में प्रवेश करता है {, तो यह आंतरिक बचत स्टैक पर एक नया समूह स्तर बनाता है। इसका मतलब यह है कि सभी वर्तमान मैक्रोज़ और रजिस्टर सहेजे जाते हैं। जब \globalतक समूह द्वारा बंद नहीं किया जाता है तब तक उनके लिए कोई भी संशोधन (जब तक स्पष्ट रूप से चिह्नित नहीं किया जाता है ) केवल सक्रिय हो रहा है }। इसका मतलब यह है कि ~एक समूह के भीतर पुनर्परिभाषित किया जा सकता है, नई परिभाषा के साथ वहां उपयोग किया जाता है, और समूह समाप्त होने के बाद पुरानी रक्षा स्वचालित रूप से बहाल हो जाएगी।

यहाँ एक उदाहरण है:

\def~{abc}
~ -- {\def~{123}~} -- ~

यह आउटपुट

एबीसी - 123 - एबीसी

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

\newcount\x
\x=3
Print a char \the\x\ times,
{\x=-\x \advance\x 10 pad with \the\x\ spaces,}
and go on with x=\the\x.

जो आउटपुट देता है

एक चार बार प्रिंट करें, 7 स्थानों के साथ पैड करें, और x = 3 के साथ आगे बढ़ें।

यह समूहीकरण व्यवहार विशेष रूप से महत्वपूर्ण है यदि आप नेक्सिंग के लिए TeX के मानक मैक्रोज़ का उपयोग करना चाहते हैं \loop ... \repeat। ये मैक्रोज़ आंतरिक कमांड को परिभाषित करते हैं और आगे बढ़ने का निर्धारण करने के लिए उनका उपयोग करते हैं। आंतरिक लूप को ब्रेसिज़ में डाले बिना उन्हें घोंसला करना आंतरिक आदेशों को भ्रमित करेगा और अप्रत्याशित व्यवहार को जन्म देगा।


1

काउंटरों की उन्नति, जैसे कि

\advance\u by 1
\multiply\u by 3
\divide\u by 2

के रूप में भी काम करते हैं

\advance\u1        % \u = \u + 1
\advance\u-1       % \u = \u - 1
\multiply\u3       % \u = \u * 3
\multiply\u\u      % \u = \u * \u
\divide\u2         % \u = \u / 2

एक ही सिद्धांत प्रारंभिककरण के लिए भी काम करता है:

\newcount\u\u1

काउंटर \ u को 1 पर सेट करता है।

ध्यान दें कि उनके (या a \relax, लेकिन व्हाट्सएप वही करता है ) के बाद इन व्हाट्सएप कैरेक्टर (लाइनब्रेक या स्पेस) की जरूरत होती है , इसलिए अगले कमांड को नजरअंदाज नहीं किया जाएगा। उदाहरण के लिए,

\u1\the\u

\ u प्रिंट नहीं करता है, लेकिन \theकमांड को अनदेखा करता है ।


1

\enddocumentइसके बजाय \end{document}दो वर्ण बचाता है


के लिए काम नहीं कर रहा है \begin{document}=> \documentहालांकि
she
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.