함께 프레임과 항목화

함께 프레임과 항목화

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

환경 beamerframe다음 기술을 사용하여 본문을 수집합니다. 한 가지 경우를 제외하고는 확장하지 않고 찾기에 따라 토큰을 읽고 저장합니다 ( \begin{frame}아래 \end{frame}참조). 이 수집 프로세스 중과 \end{frame}동일한 수 \begin{...}입니다 \end{...}(일치하려고 시도하지 않음). 이것이 from \beamer@begin@stack에 사용되는 것입니다 .\beamer@collect@@bodybeamerbaseframe.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}

스크린샷


각주

  1. 보다 정확하게는 다음과 같은 일이 발생합니다( 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{...}

답변2

패키지 사용 environ:

\documentclass{beamer}
\usepackage{environ}

\NewEnviron{myframe}[1][]{%
\begin{frame}{#1}
\begin{itemize}
\BODY
\end{itemize}
\end{frame}
}

\begin{document}
\begin{myframe}
\item First
\item Second
\end{myframe}
\end{document}

여기에 이미지 설명을 입력하세요

관련 정보