2009-07-11 8 views
7

टी एक्स में, यह कैसे भागों में \mana{X1 2W/UB R /G} के रूप में एक स्ट्रिंग इस तरह विभाजित है और (एक और मैक्रो के लिए उन्हें खिलाने के लिए इस मामले में, कुछ ऐसा करके मैक्रो मंगलाचरण को बदलने के लिए संभव है \m{X}\m{12}\m{W/U}\m{B}\m{R/G}), बहुत सरल नियमों से समूहित, अर्थात्: ए) लगातार अंक समूह बनाते हैं, बी) एक स्लैश दो आस-पास के पात्रों का समूह बनाता है, सी) रिक्त स्थान को पूरी तरह से छीन लिया जाना चाहिए?टेक्स: स्ट्रिंग पार्स और रिक्त स्थान को अलग करना

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

\def\lcpass#1.{} 
\def\lcloop#1#2.{% 
    \ifempty{#2}% 
     #1% 
     \let\continue=\lcpass% 
    \else% 
     \let\continue=\lcloop% 
    \fi% 
    \continue#2.} 

\def\lastchar#1{\lcloop#1.} % returns the last character of a string 

के रूप में हाथ से लिखा छोरों जब स्ट्रिंग खाली स्थान के में समाप्त होता है काम करने के लिए असफल हो, न तो मैं \futurelet साथ सफल रहा था।

सामान्य रूप से, टी एक्स में स्ट्रिंग पार्सिंग के कार्य को कैसे पूरा करता है? उदाहरण के लिए, texmate पैकेज |1 e4 e5 Nf3 Nc6| जैसी चीजें लिखने की अनुमति देता है और स्वचालित रूप से संबंधित शतरंज की स्थिति खींचता है। इसे यह कैसे करना है? स्ट्रिंग में वर्णों पर लूपिंग के बारे में मैं क्या पढ़ सकता हूं और अन्य टी एक्स इस तरह हैक करता है?

उत्तर

3

यहाँ है कि मैं क्या अंततः TeX/LaTeX में MTG मन में प्रवेश करने के लिए किया था है:


% http://www.tug.org/TUGboat/Articles/tb28-1/tb88glister.pdf 

\newif\[email protected]@digit 

\def\@[email protected]#1{% lame, I know, but nothing else worked 
    \@[email protected]% 
    \def\@[email protected]{0}\ifx\@[email protected]#1\@[email protected]\fi% 
    \def\@[email protected]{1}\ifx\@[email protected]#1\@[email protected]\fi% 
    \def\@[email protected]{2}\ifx\@[email protected]#1\@[email protected]\fi% 
    \def\@[email protected]{3}\ifx\@[email protected]#1\@[email protected]\fi% 
    \def\@[email protected]{4}\ifx\@[email protected]#1\@[email protected]\fi% 
    \def\@[email protected]{5}\ifx\@[email protected]#1\@[email protected]\fi% 
    \def\@[email protected]{6}\ifx\@[email protected]#1\@[email protected]\fi% 
    \def\@[email protected]{7}\ifx\@[email protected]#1\@[email protected]\fi% 
    \def\@[email protected]{8}\ifx\@[email protected]#1\@[email protected]\fi% 
    \def\@[email protected]{9}\ifx\@[email protected]#1\@[email protected]\fi% 
    } 


\catcode`\^^G=12 

\newcommand*{\@[email protected]}[2]{% 
    \let\@[email protected]=#1% 
    \def\@[email protected]{#2}% 
    \ifx\@[email protected]\@empty% 
    \else% 
     \@@[email protected]#2^^G% 
    \fi% 
} 

\def\@@[email protected]#1#2^^G{% 
    \def\@[email protected]{#1}% 
    \def\@[email protected]{#2}% 
    \ifx\@[email protected]\@empty% 
     \let\@[email protected]=\@gobble% 
    \else% 
     \@[email protected]{#1}% 
     \ifx\@[email protected]\@empty% 
      \let\@[email protected]=\@gobble% 
     \else% 
      \let\@[email protected]=\@@[email protected]% 
     \fi% 
    \fi% 
    \@[email protected]#2^^G% 
} 

\catcode`\^^G=15 

% these are meant to be redefined 
\def\[email protected]#1{(\MakeUppercase{#1})} 
\def\[email protected]@colored#1{\[email protected]{#1}} 
\def\[email protected]@colorless#1#2{\[email protected]{#1#2}} 
\def\[email protected]@hybrid#1#2{\[email protected]{#1/#2}} 

\gdef\@[email protected]{.} 
\gdef\@[email protected]{/} 
\let\@[email protected]=\@[email protected] 
\let\@[email protected]=\@[email protected] 

\def\@[email protected]#1{% 
    \gdef\@[email protected]{#1}% 
    \ifx\@[email protected]\@[email protected]% 
    \else% 
     \ifx\@[email protected]\@[email protected]% 
      \[email protected]@hybrid{\@[email protected]}{\@[email protected]}% 
      \let\@[email protected]=\@[email protected]% 
      \let\@[email protected]=\@[email protected]% 
     \else% 
      \@[email protected]\@[email protected]\[email protected]@digit% 
       \@[email protected]\@[email protected]\[email protected]@digit% 
        \ifx\@[email protected]\@[email protected]% 
         \[email protected]@colorless{}{\@[email protected]}% 
        \else% 
         \[email protected]@colorless{\@[email protected]}{\@[email protected]}% 
         \let\@[email protected]=\@[email protected]% 
        \fi% 
       \else% 
        \[email protected]@colorless{}{\@[email protected]}% 
       \fi% 
      \else% 
       \[email protected]@colored{\@[email protected]}% 
      \fi% 
     \fi% 
    \fi% 
    \let\@[email protected]=\@[email protected]% 
    \let\@[email protected]=\@[email protected]% 
} 

\newcommand{\mana}[1]{% 
\let\@[email protected]=\@[email protected]% 
\let\@[email protected]=\@[email protected]% 
\@[email protected]{\@[email protected]}{#1\@[email protected]\@[email protected]}} 
+0

मेरे जवाब के साथ क्या गलत? यह छोटा दिखता है। –

+0

कुछ भी गलत नहीं है, लेकिन मुझे आपके समाधान को देखने का मौका मिलने से पहले मैं इस समाधान को समझने में सक्षम था। –

3

जैसा कि अक्सर होता है, एक अच्छी तरह से सवाल आधा समाधान है। यहाँ मैं ऊपर पोस्ट लिख के बाद क्या मिला है:

http://www.tug.org/TUGboat/Articles/tb28-1/tb88glister.pdf

"\allchars में से एक दुर्भाग्यपूर्ण संपत्ति है कि यह मूल स्ट्रिंग में सभी रिक्त स्थान को छोड़ देता है है," यह कहते हैं। हा हा

6
\def\m#1{\par$m$({\tt #1})}% Any macros 
\def\removespaces{\catcode`\ =9 }% Ignore all spaces` 

\let\manaNext\relax % aux def 
\let\manaLastChar\relax % aux def 
\newtoks\manaToks % aux toks 
\newif\ifDigitProcessing 

\def\mana#{\afterassignment \manaA \let\next= }% always next = { 
\def\manaA{\bgroup \removespaces \let\manaNext\manaB \manaNext}% algorithm init: ignore spaces 
\def\manaB{\futurelet\next\manaC}% algorithm start 
\def\manaC{\ifx\next\egroup \def\nnext{\manaFlush\aftergroup\manaNext}\else\let\nnext\manaD\fi\nnext}% check for \egroup 
\def\manaD{\ifx\next/\let\nnext\manaSlash\else \ifcat\next 1\let\nnext\manaDigit \else \let\nnext\manaE \fi\fi \nnext}% cases 
\def\manaE#1{\manaFlush\DigitProcessingfalse\let\manaLastChar\next\manaNext}% Letters A-Z and a-z case 
\def\manaFlush{\ifx\manaLastChar\relax\else\m{\manaLastChar}\fi\let\manaLastChar\relax 
       \ifDigitProcessing\expandafter\m\expandafter{\the\manaToks}\fi\manaToks{}}% transform to \m{...} 
\def\manaSlash#1#2{\m{\manaLastChar/#2}\let\manaLastChar\relax\manaNext}%#1=/, #2=next letter 
\def\manaDigit#1{\ifDigitProcessing\else\manaFlush\fi 
     \manaToks=\expandafter{\the\manaToks#1}\DigitProcessingtrue\manaNext}% 0-9 case 

\hrule\medskip 
\mana{X1 2W/UB R /G} 
\medskip\hrule\medskip 

\mana{X1 2W/UB s/SS 14 1 R /G XZ} 
\medskip\hrule\medskip 
संबंधित मुद्दे