2010-06-01 2 views
2

나중에 사용할 수 있도록 환경 안에 텍스트를 저장하려고합니다. 내가 생각해 낼 수있는 가장 작은 테스트 케이스는 이것이다. 환경이 닫히면 sbox에 저장된 텍스트를 사용할 수 없습니다. 어떻게 해결할 수 있습니까? 감사.환경 내에서 sbox

\documentclass{article} 
\begin{document} 
\newsavebox{\somebox} 
\begin{itemize} 
\item hello1 
\item hello1 \sbox{\somebox}{Some text} 
\end{itemize} 
This should show something, but does not: "\usebox{\somebox}" 
\end{document} 

답변

2

여기서 실행중인 것은 범위 지정 문제입니다. (La) TeX에서 { ... }, \bgroup ... \egroup 또는 \begingroup ... \endgroup으로 범위를 도입 할 수 있습니다. 앞의 두 개는 대략 같습니다. \bgroup\egroup\let\bgroup{\let\egroup}으로 정의됩니다. 마지막 하나는 약간 다릅니다. 그러나 스코핑 속성은 동일합니다. 스코프 내에서 생성되거나 수정 된 명령, 상자 등은 외부에서 볼 수 없습니다. LaTeX에서는 모든 환경이 \begin{env} ... \end{env}이고 내용은 \begingroup ... \endgroup에 암시 적으로 래핑됩니다. 즉 \sbox{\somebox}{Some text} 수정은 \end{itemize}까지만 볼 수 있습니다. 그 후에 수정은 취소됩니다. 이 문제를 해결하려면 \newcommand, \def, \newsavebox, \sbox 등의 모든 명령 앞에 \global과 같은 명령을 추가합니다. 그러면 전역 범위에서 정의가 강제로 생성되어 모든 곳에서 볼 수 있습니다.

또한 (La) TeX에서 따옴표를 사용하려면 , ``double quoted" 또는 `single quoted'으로 작성하십시오. " 문자는 따옴표를 닫을 때만 사용할 수 있으며 따옴표를 열지 않을 경우에만 사용할 수 있습니다. 이 모든 것을 함께 사용하면 수정 된 스 니펫을 얻을 수 있습니다.

\documentclass{article} 
\begin{document} 
\newsavebox{\somebox} 
\begin{itemize} 
    \item hello1 
    \item hello1 \global\sbox{\somebox}{Some text} 
\end{itemize} 
This should show something, and in fact does: ``\usebox{\somebox}'' 
\end{document} 
+0

설명해 주셔서 감사합니다. 그'\ global'은 실제로 트릭이었습니다. –

1

은 내가 \def를 사용하여이 문제를 해결할 수 있다고 생각합니다. 같은 :

\ documentclass 명령 {기사} \ 시작 {문서} \ 시작 {항목 화는} 이 \ 항목 hello1 \ 글로벌 \ 데프 \의 somebox {텍스트} 끝 \ \ 항목 hello1 는 {항목별로} 여기에 뭔가가 표시되어야합니다. \ somebox \ end {document}