2010-05-26 9 views
5

मैं एक पुराने अच्छा \newenvironment में \NewEnviron (पैकेज 'वातावरण') के साथ बनाई गई एक वातावरण रैप करने के लिए कोशिश कर रहा हूँ: colorbox → NewEnviron → newenvironment की ट्रिपल-रैपिंग में विफल रहता है

\NewEnviron{test}{\colorbox[gray]{0.7}{\BODY}} 
\newenvironment{wrapper}{\begin{test}}{\end{test}} 

\begin{wrapper} 
debug me 
\end{wrapper} 

बहरहाल, यह मुझे देता है एक अजीब त्रुटि:

LaTeX Error: \begin{test} on input line 15 ended by \end{wrapper}. LaTeX Error: \begin{wrapper} on input line 15 ended by \end{document}.

अगर मैं \newenvironment{test}{aaa(}{)bbb} साथ \NewEnviron{test}{aaa(\BODY)bbb} की जगह - सब कुछ उम्मीद के रूप में काम करता है! ऐसा लगता है कि \NewEnviron कुछ कारणों से अपना अंत ढूंढने में विफल रहता है।

मैं \colorbox में लिपटे 'फ्लोटफिग' के साथ कुछ जादू करने की कोशिश कर रहा हूं, इसलिए मुझे \colorbox को पर्यावरण में बदलने और इसे दूसरे में लपेटने का एक तरीका चाहिए। मैं एक नया आदेश परिभाषित कर सकता हूं लेकिन यह एक बहुत अच्छा विचार नहीं है।

उत्तर

6

बात यह है कि \NewEviron और \newenvironment विभिन्न तरीकों से काम करता है।

1) \newenvironment{test}{aaa(}{)bbb} दो आदेशों को परिभाषित करता है: \testaaa( है और \endtest)bbb है।

\begin{test} को \test तक बढ़ाया गया है।

\end{test}\endtest और जांच करता है कि आपके गुंजाइश, begin{test} बल्कि \begin{something else} साथ शुरू होता है उदाहरण के लिए \begin{wrapper} करने के लिए विस्तारित किया गया है।

2) \NewEviron{test}{aaa(\BODY)bbb}\test को अलग-अलग तरीके से परिभाषित करता है। सभी \test कैच \BODY निम्नलिखित चाल

\def\test#1\end{\def\BODY{#1}aaa(\BODY)bbb\testcontinue} 

का उपयोग कर सबसे पहले (नाम \testcontinue अलग हो सकता है) और aaa(\BODY)bbb सम्मिलित करता है। फिर \testcontinue कुछ इनपुट लाइन पर \end{test}\end{something else} के बजाय समाप्त होता है। मैक्रो \endtest की आवश्यकता नहीं है क्योंकि इसे कभी भी निष्पादित नहीं किया जाता है।

अपने कोड पर देखो:

\begin{wrapper} 
debug me    
\end{wrapper} 

\begin{wrapper}\begin{test} करने के लिए विस्तारित किया गया है। फिर \begin{test} को \test पर विस्तारित किया गया है। \test पकड़ \BODY। ध्यान दें! \BODYdebug me के बराबर है। और अब \testcontionue \end\BODY\end{test} के बाद \end चेक करता है। यह सच नहीं है। \end{test} अनुपस्थित है। \end{wrapper} है।

आप कहना चाहते हैं कि \end{wrapper} को \end{test} पर विस्तारित किया जाना चाहिए। लेकिन \end आवरण से पहले से

macro \test: #1\end{\def\BODY{#1}aaa(\BODY)bbb\testcontinue} 

खाया था और निष्पादित नहीं किया जा सकता है।

मुझे उम्मीद है कि मुझे सफलता की व्याख्या होगी।

+0

आपकी व्याख्या बहुत बढ़िया है, धन्यवाद! मुझे लगता है कि इसका मतलब है कि मैं इसे किसी अन्य वातावरण में लपेट नहीं सकता? या शायद एक चाल है जिसके बारे में मुझे पता नहीं है? – kolypto

+1

आप '\ newenvironment' का उपयोग क्यों नहीं करना चाहते हैं? –

+0

मुझे '\ colorbox' का एक पर्यावरणीय संस्करण बनाने की आवश्यकता है और मुझे यह नहीं पता कि यह कैसे करें :) – kolypto

1

मुझे एक ऐसा वातावरण बनाने के लिए एक हैकी चाल मिली है जिसे किसी दूसरे में लपेटा जा सकता है। किसी को saveBoxes का उपयोग इस तरह करना चाहिए:

\newenvironment{example}[2][]{% 
    \newsavebox{\exampleStore} % Box storage 
    \begin{lrbox}{\exampleStore} % Start capturing the input 
    }{% 
     \end{lrbox} % Stop capturing the input 
    \colorbox[gray]{0.7}{% 
      \usebox{\NBstorage} % Load the box's contents 
      }% 
     }% 
    }%