"폭주 논쟁?" \NewEnviron 오류

"폭주 논쟁?" \NewEnviron 오류

두 개의 파일이 있습니다. 기본적으로 메인 파일은 Environ 패키지를 로드하고 보조 파일을 입력합니다. 보조 파일은 기본적으로 아무것도 하지 않는 환경을 생성하고 해당 환경의 인스턴스 하나를 생성합니다.

main.tex:

\documentclass{scrartcl}
\usepackage{environ}
\begin{document}
  \input{secondary.tex}
\end{document}

보조.tex:

\NewEnviron{myenv}{\BODY}
\begingroup
  \myenv
    Hello
  \endmyenv
\endgroup

다음과 같은 오류 메시지가 나타납니다.

Runaway argument?
Hello \endmyenv \endgroup \par
! File ended while scanning use of \document.
<inserted text>
                \par
l.5 \input{secondary.tex}

다음 중 하나(!)를 변경하면 예제가 예상대로 작동합니다.

  • \newenvironment대신 사용\NewEnviron
  • \begin{myenv}...\end{myenv}대신 사용\begingroup\myenv...\endmyenv\endgroup
  • Secondary.tex를 입력하는 대신, Secondary.tex의 내용을 main.tex에 직접 배치하세요.

왜 이것이 작동하지 않습니까?

답변1

environ환경 내용을 캡처하기 위해 정의에 TeX 매개변수 텍스트를 사용하는 환경을 만듭니다. 이 매개변수-텍스트 스타일 정의를 사용하면 패키지가 환경 콘텐츠를 캡처할 수 있지만 매크로/정의의 매우 엄격한 사용도 필요합니다... 명령 스타일 환경을 사용할 때 준수하지 않는 것( \myenv... \endmyenv오히려 보다 \begin{myenv}... \end{myenv}).

광범위하게 말하면 환경의 시작을 지정하는 \NewEnviron{myenv}매크로를 생성하며 \myenv이 매크로는 다음을 감시합니다.정확히 \end{myenv}... 다른 건 없어요.

예제 \input가 없기 때문에 사용할 때 실패합니다.명백한 \end{<something>}\myenv찾고 있는 것 입니다. secondary.tex와 어떤 유사점도 발견하기 전에 의 끝에 도달합니다 \end. 실제로는 찾고 있습니다 \end{document}(아래 참조).

문제를 해결한 세 가지 사례를 살펴보고 그 이유를 살펴보겠습니다.

  • \newenvironment대신 사용\NewEnviron

    이것이 왜 작동하는지 분명해야 합니다. 및 \newenvironment{myenv}를 모두 정의 하므로 환경의 명령 정의를 사용하면 문제 없이 작동합니다.\myenv\endmyenv

  • \begin{myenv}...\end{myenv}대신 사용\begingroup\myenv...\endmyenv\endgroup

    이것이 바로 를 environ사용하여 환경을 정의할 때 사용해야 할 것으로 예상되는 것입니다 \NewEnviron. 따라서 이는 기본적으로 작동합니다.명시적으로환경 종료를 사용했습니다 \end{myenv}.

  • 내용을 입력하는 대신 secondary.tex직접 입력하세요.main.texsecondary.tex

    환경의 명령 형식을 사용하고 있으므로 "현재 환경"(LaTeX에서는 으로 알려짐 \@currenvir)은 실제로 변경되지 않습니다. 즉, document(호출로 인해 \begin{document}) 환경 내부에 있는 것처럼 유지됩니다. 따라서 환경 종료 캡처는 실제로 의 설정 \end{document}에 따릅니다 . newenviron당신의환경로 "시작" \myenv하고 로 끝납니다 \end{document}. 이상하지만 예상되는 환경 범위 지정을 사용하지 않을 때 작동하는 방식입니다 \begin{...}... \end{...}.

의 컨텍스트 내에서 제대로 작동하려면 newenviron범위 지정 \begin{myenv}... 을 사용하세요 \end{myenv}. 이 범위 지정은 \begingroup... 을 통해 구현하는 데 필요한 그룹화를 제공합니다 \endgroup.

또는 다음 항목 \myenv에 도달할 때까지 항목을 캡처하도록 정의합니다 \endmyenv.

\documentclass{scrartcl}
\usepackage{filecontents}
\begin{filecontents*}{secondary.tex}
\long\def\myenv #1\endmyenv{#1}% Fake myenv environment that captures its body
\begingroup
  \myenv
    Hello
  \endmyenv
\endgroup
\end{filecontents*}
\begin{document}
\input{secondary.tex}
\end{document}

답변2

그렇습니다~ 아니다콘텐츠를 기본 파일에 배치하면 작동합니다. 오류만 발생하지 않습니다. 이 시도:

\documentclass{scrartcl}
\usepackage{environ}
\begin{document}
\NewEnviron{myenv}{BEGIN\BODY END}
\begingroup
  \myenv
    Hello
  \endmyenv
\endgroup

World

\end{document}

Environ은 구문 분석을 중지하려면 \end{myenv}를 찾아야 합니다.

관련 정보