두 개의 파일이 있습니다. 기본적으로 메인 파일은 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.tex
secondary.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}를 찾아야 합니다.