2010-05-26 12 views
5

Tôi cố gắng để quấn một môi trường tạo ra với \NewEnviron (gói 'environ') vào một tuổi tốt \newenvironment:Triple-gói của hộp thuốc vẽ → NewEnviron → newenvironment không

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

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

Tuy nhiên, điều này mang lại cho tôi một lỗi lạ:

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

Nếu tôi thay \NewEnviron{test}{aaa(\BODY)bbb} với \newenvironment{test}{aaa(}{)bbb} - tất cả mọi thứ hoạt động như mong đợi! Có vẻ như \NewEnviron không tìm thấy kết thúc vì một số lý do.

Tôi đang cố gắng thực hiện một số phép thuật với 'floatfig' được bao bọc thành \colorbox vì vậy tôi cần một cách để chuyển đổi \colorbox sang môi trường và gói nó vào một môi trường khác. Tôi có thể định nghĩa một lệnh mới nhưng đó không phải là một ý tưởng hay.

Trả lời

6

Điều này là \NewEviron\newenvironment hoạt động theo nhiều cách khác nhau.

1) \newenvironment{test}{aaa(}{)bbb} xác định hai lệnh: \testaaa(\endtest)bbb.

\begin{test} được mở rộng thành \test.

\end{test} được mở rộng để \endtest và kiểm tra rằng phạm vi của bạn bắt đầu với begin{test} thay \begin{something else}, ví dụ \begin{wrapper}.

2) \NewEviron{test}{aaa(\BODY)bbb} xác định \test theo cách khác. Trước hết \test đánh bắt các \BODY bằng cách sử dụng thủ thuật sau đây

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

(tên \testcontinue có thể khác nhau) và chèn aaa(\BODY)bbb. Sau đó, \testcontinue kiểm tra rằng \end trên một số dòng nhập đã kết thúc bằng \end{test} thay vì \end{something else}. Macro \endtest không cần thiết vì nó không bao giờ được thực thi.

Nhìn vào mã của bạn:

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

\begin{wrapper} được mở rộng để \begin{test}. Sau đó, \begin{test} được mở rộng thành \test. \test bắt \BODY. Chú ý! \BODY bằng debug me. Và bây giờ \testcontionue kiểm tra rằng \end sau \BODY kết thúc bằng \end{test}. Nó không phải là sự thật. \end{test} vắng mặt. Có \end{wrapper}.

Bạn muốn nói rằng \end{wrapper} phải được mở rộng thành \end{test}. Nhưng \end trước khi bao bọc được ăn bởi

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

và không thể thực thi được.

Tôi hy vọng tôi thành công để giải thích.

+0

Giải thích của bạn rất tuyệt vời, cảm ơn bạn! Tôi đoán điều đó có nghĩa là tôi không thể quấn nó vào một môi trường khác? hoặc có thể có một mẹo mà tôi không biết? – kolypto

+1

Tại sao bạn không muốn sử dụng '\ newenvironment'? –

+0

Tôi cần phải tạo ra một phiên bản môi trường của '\ colorbox' và không có ý tưởng làm thế nào để làm điều đó :) – kolypto

1

Tôi đã tìm thấy một mẹo hack để tạo một môi trường có thể được bao bọc trong một gói khác. Người ta nên sử dụng saveBoxes như thế này:

\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 
      }% 
     }% 
    }%