frame
로 재정의하고 싶습니다 frame + itemize
. 나는 지금까지 이것을 시도했습니다 -
\documentclass{beamer}
\newenvironment{myframe}{\begin{frame}\begin{itemize}}{\end{itemize}\end{frame}}
\begin{document}
\begin{myframe}
\item
\end{myframe}
\end{document}
정확히 무엇이 잘못되었으며 이를 올바르게 재정의하는 방법은 무엇입니까?
답변1
환경 beamer
은 frame
다음 기술을 사용하여 본문을 수집합니다. 한 가지 경우를 제외하고는 확장하지 않고 찾기에 따라 토큰을 읽고 저장합니다 ( \begin{frame}
아래 \end{frame}
참조). 이 수집 프로세스 중과 \end{frame}
동일한 수 \begin{...}
입니다 \end{...}
(일치하려고 시도하지 않음). 이것이 from \beamer@begin@stack
에 사용되는 것입니다 .\beamer@collect@@body
beamerbaseframe.sty
스택이 비어 있고(즉, after \end{...}
만큼 많이 본 경우 ) 다음이 an이 아닌 경우 이것이 나타나기를 바라면서 확장합니다 . 1\begin{...}
\begin{frame}
\end{...}
\end{frame}
\end
\end{frame}
그러나 이것은오직내가 준 조건에 따라 발생합니다( 이니셜 이후에도 \end{...}
많이 봤어야 함).\begin{...}
\begin{frame}
귀하의 예에서 스택에 \begin{itemize}
하나를 푸시합니다 b
(즉, 한 레벨을 엽니다) \beamer@begin@stack
. 읽으면 b
팝업됩니다 . \end{myframe}
이 시점 에서 \beamer@collect@@body
는 . 이것은 사실이지만 오해의 소지가 있습니다. 왜냐하면 확장되면 두 개의 팝이 생성되기 때문입니다. 따라서 다음은 아마도 토큰을 확장한 후에 제공해야 한다고 생각합니다 (각주 1 참조). 아아, 이것은 잘못된 것입니다. 다음 은 입니다 . 따라서 확장된 다음 계속 검색 하지만 물론 찾지 못하고 파일 끝에 도달하여 오류가 발생합니다.\begin{...}
\end{...}
\begin{frame}
\end{myframe}
\beamer@begin@stack
\end{...}
\end{frame}
\end...
\end{...}
\end{document}
\enddocument
\beamer@collect@@body
\end{frame}
Runaway argument?
\let \AtEndDocument \@firstofone \@enddocumenthook \@checkend {docume\ETC.
! File ended while scanning use of \beamer@collect@@body.
<inserted text>
\par
따라서 기본적으로 문제는 이 중 두 개( )를 숨기고 가 있음에도 불구하고 확장 을 통해 발견 하지 못하기 때문에 \beamer@collect@@body
의 적절한 수를 유지할 수 없다는 것입니다 . this ( 로 인해 비어 있지 않은 스택 ).\end{...}
\end{myframe}
\end{itemize}\end{frame}
\beamer@collect@@body
\endmyframe
\end{myframe}
\begin{...}
\end{...}
\end{myframe}
\begin{itemize}
솔루션 에서는 확장되지 않는 \end{...}
매크로에 숨지 않도록 요구합니다 . \beamer@collect@@body
하나는environ
다음과 같이 패키지를 사용하고 있습니다.페라 페자의 답변, 다른 하나는 다음과 같이 사용하고 있습니다 \itemize
( \enditemize
둘 중 어느 것도 스택에 영향을 미치지 않으므로 sees \beamer@begin@stack
경우 스택이 비어 있으므로 한 번 확장되어 환경 본문 스캐닝 프로세스에 표시됩니다).\beamer@collect@@body
\end{myframe}
\endmyframe
\end{frame}
\documentclass{beamer}
\newenvironment*{myframe}[1]
{\begin{frame}{#1}%
\begingroup\itemize}
{\enditemize\endgroup
\end{frame}}
\begin{document}
\begin{myframe}{Frame title}
\item An item
\item Another item
\end{myframe}
\end{document}
각주
보다 정확하게는 다음과 같은 일이 발생합니다(
beamer 2018/12/02 v3.55
). 만약에:- 스택
\beamer@begin@stack
은 비어 있습니다( 본문이 수집된 이후에 표시된\end{...}
만큼 ).\begin{...}
\begin{frame}
- 다음은 가 아닙니다
\end{...}
. ,\end{frame}
\end{foobar}
그런 다음 수집된 자료에서 이를 의
\beamer@collect@@body
첫 번째 수준 확장으로 대체합니다 . 이는 확장이 생성하는 것과 유사 하지만 후자는 몇 가지 추가 작업을 수행합니다( 272페이지 참조).\endfoobar\endgroup
\end{foobar}
\end{foobar}
source2e.pdf
\@currenvir
의 대체 텍스트를 확인하십시오foobar
(이것은beamer
frame
우리가 말하는 본문 수집 프로세스 에서 실패할 것\@currenvir
입니다frame
).- 이전
\@endparenv
명령을 존중합니다(해당 텍스트 앞에 빈 줄이나 이 표시되지 않는 한 일부 단락 작성 환경에 따라 텍스트 시작 부분에서 단락 들여쓰기를 억제하는 데 사용됨\par
). - 이전 명령을 존중합니다 (다음 명령이 뒤따르는 공백을 무시
\ignorespacesafterend
하도록 하는 데 사용됨 ).\end{...}
- 스택