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}}
"끝" 코드의 시작 부분에서 바로 호출되는 경우 여기에서는 \@checkend
inside 가 호출됩니다 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
개발.