\endenvironment를 실행한 후에 \@checkend가 발생하는 이유는 무엇입니까?

\endenvironment를 실행한 후에 \@checkend가 발생하는 이유는 무엇입니까?

LaTeX 정의에서 최종 환경 코드를 실행한 후에 명령이 발생하는 \end이유 를 아는 사람이 있습니까? \@checkend오류 잡기 목적으로는 가능한 한 빨리 사용자에게 문제가 있음을 알려주는 것이 가장 좋습니다.

enva나는 몇 가지 환경을 개발하고 있는데 envb우연히 이렇게 말하기 때문에 이것을 묻습니다.

\begin{enva}
% some stuff
\end{envb}

내부에 낮은 수준의 오류가 발생합니다 \endenvb. 이를 방지하기 위해 \@checkend내부에 나만의 스타일 검사를 넣어야 하는데 , 이는 나를 위해 해야 할 일 \endenvb의 일부처럼 보입니다 .\begin\end

이 문제의 간단한 예로 다음 코드를 고려해보세요.

\documentclass{article}
\usepackage{tikz}
\begin{document}
\def\test{}
\begin{test}
\end{tikzpicture}
\end{document}

오류가 발생합니다.

! Undefined control sequence.
\endtikzpicture ...r@layerlist@globally \endscope 
                                                  \let \pgf@baseline =\pgf@s...
l.10 \end{tikzpicture}

내가 원하는 것보다 덜 밝습니다. 비슷한 쓸모없는 오류가 내 코드에 나타나는 것을 방지하고 싶습니다.

\end참고로, 이 문제를 해결하기 위해 제가 수행한 작업은 다음 명령을 작성하는 것입니다. 이를 각 환경의 코드 시작 부분에 넣었습니다 .

% #1 -- the name of the environment being ended
\def\mypkg@checkend#1{
    \def\mypkg@tempa{#1}
    \ifx\mypkg@tempa\@currenvir\else % mismatch
        \mypkg@error{endenv-mismatch}
        \csname end\@currenvir\endcsname % run the \end code for the correct environment
        \def\@currenvir{#1} % Prevent \@checkend from throwing a second redundant error
        \expandafter\mypkg@break % don't run the rest of \endthisenvironment
    \fi
}

답변1

환경 구현에는 다른 환경이 포함될 수 있습니다.

\newenvironment{foo}{\begin{center}}{\end{center}}

"끝" 코드의 시작 부분에서 바로 호출되는 경우 여기에서는 \@checkendinside 가 호출됩니다 center. 그만큼\@checkend ~ 후에"끝" 부분( \end<environment>)을 사용하면 "시작" 부분에서 열린 다른 환경이 제대로 닫힐 수 있습니다.

답변2

게다가하이코의 대답, 또한 테이블이 관련된 확장을 통해 환경 종료 코드가 작동해야 할 수도 있습니다. 매크로를 보호 하면 (확장할 수 없는) 정의를 이동하지 않고도 이를 볼 수 있습니다 \end....

\documentclass{article}
\newenvironment{foo}[1]
  {\begin{tabular}{#1}}{\end{tabular}}
\begin{document}
\fbox{%
  \begin{foo}{ccc}
    \hline
    Test & a & b \\
    \hline
  \end{foo}
}
\protected\edef\endfoo{\unexpanded\expandafter{\endfoo}}
\fbox{%
  \begin{foo}{ccc}
    \hline
    Test & a & b \\
    \hline
  \end{foo}
}
\end{document}

예를 들어 이것은xparse개발.

관련 정보