글꼴 크기 환경이 존재합니까?

글꼴 크기 환경이 존재합니까?

의심의 여지 없이 제어 시퀀스 형태의 글꼴 크기 스위치가 있습니다(설명됨).여기예를 들어.) 그러나 때때로 환경 버전이 사용된 코드 예제를 만났습니다 \begin{small}...\end{small}. 그것들을 성공적으로 테스트한 후 나는 그것들을 내 TeX 어휘에 통합하기 시작했습니다.

며칠 전 @GonzaloMedina는 그러한 환경이 존재하지 않으며 이에 의존하는 구성이 순전히 우연의 일치로 작동한다는 내 답변 중 하나에 대해 언급했습니다. 그런 다음 나는 그 불길한 환경에 대해 더 많이 알아내려고 노력했습니다. 어떻게든 문서화되지 않은 것 같기 때문에 불길합니다. (어느 정도 체계적인 방식으로 설명하려고 시도한 유일한 것은 Wikibooks 리소스였습니다.)

이러한 환경은 실제인가, 아닌가?

답변1

LaTeX에서 정의한 모든 명령을 사용 \newcommand하고 \begin{}...\end{}그 주위에 쌍을 래핑할 수 있지만 이는 환경이 아니기 때문에 권장되지 않습니다.

그러나 흥미로운 점은 어쨌든 그룹화가 작동하지만 이는 \begin...\end.

등이 \begin{small}없기 때문에 등과 같은 글꼴 크기 환경이 없습니다 .\begin{chapter}

예를 들면 다음을 참조하세요.

\documentclass{article}


\newcommand{\foo}{This does nothing}

\begin{document}
\begin{foo}

\end{foo}
\end{document}

편집하다몇 가지 설명

latex.ltx이 코드는 4058f행 에서 찾을 수 있습니다 .

\def\begin#1{%
  \@ifundefined{#1}%
    {\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}%
    {\def\reserved@a{\def\@currenvir{#1}%
     \edef\@currenvline{\on@line}%
     \csname #1\endcsname}}%
  \@ignorefalse
  \begingroup\@endpefalse\reserved@a}

그것이 정의되었으므로 이름이 설정되고 (즉 ) 호출 @ifundefined{foo}되므로 거짓이라고 볼 수 있습니다 .\fooenvironmentfoo\csname #1\endcsname\foo

이제 \end{foo}: 부분

\def\end#1{%
  \csname end#1\endcsname\@checkend{#1}%
  \expandafter\endgroup\if@endpe\@doendpe\fi
  \if@ignore\@ignorefalse\ignorespaces\fi}

환경은 정의되지 않았지만 a로 확장되어 나쁜 일이 발생하지 않는 \end...코드(여기)를 찾습니다 .\endfoo\csname endfoo\endcsname\relax

잘 알려진 환경 중 다수는 \newenvironment. 예를 들어 \foo, and \def\endfoo, see \endequation등 의 명령을 사용하면 충분합니다 \endenumerate.

답변2

어떤 명령이든 환경으로 사용할 수 있으며, 큰 텍스트 블록을 둘러싸는 경우 편리한 경우가 많습니다.

{\small  zzz\par}

그리고

\begin{small}%
zzzz

\end{small}

다소 동등합니다.

그러나 와 달리 일반적인 TeX 토큰화 규칙으로 인해 \small뒤의 공백은 삭제되지 않습니다. \begin{small}또한 거의 항상 \par앞에 또는 빈 줄이 필요합니다 \end. 이는 명령 형식에서도 마찬가지지만, 최종 코드에 center암시적으로 포함된 것과 같은 대부분의 사용자 지정 환경이 환경 형식에서는 잊어버리기 쉽지만 \par여기서는 그렇지 않습니다.

다음의 토론도 참조하세요.

\end.... 매크로 이름이 LaTeX2e에 예약되어 있나요?

답변3

실제로 "LaTeXbook"(Leslie Lamport의 "LaTeX. A Document Preparation System"으로 적절함)은 이러한 환경의 사용을 승인합니다. 27페이지 끝에서 다음을 찾을 수 있습니다.

모든 선언에는 동일한 이름(문자 제외 \)의 해당 환경이 있습니다. 타자

\begin{em} ... \end{em}

을 입력하는 것과 같습니다 {\em ... }.

특히, "environmental" 형식은 환경에서 항상 발생하는 것처럼 선언의 효과를 로컬로 유지하기 위해 자동으로 그룹을 제공합니다( \begin문제 a \begingroup\end해당 \endgroup). 이제 \small선언이므로 위의 내용이 적용됩니다.

이는 의도적으로 수행된 것이므로 이러한 환경이 "우연히" 작동한다고 말하는 것은 옳지 않다고 생각합니다. 실제로 이미 관찰한 바와 같이, like 명령에 대한 정의가 없어도 \endsmall아무런 문제가 발생하지 않습니다. 왜냐하면 이 명령은 다음과 같이 호출되고 \csname small\endcsname따라서 정의되지 않은 경우와 동일하기 때문 \relax입니다.

그래서 결국 내 대답은 "예, 이러한 환경은 '실제'입니다"(이것이 무엇을 의미하든)입니다.


덧셈

일부 의견을 본 후 LaTeX2e에서 환경이 구현되는 방법에 대한 세부 정보를 추가하는 것이 유용할 것이라고 생각했습니다(전문 지식이 부족하기 때문에 LaTeX3에 대해서는 언급하지 않겠습니다). Christian Hupfer는 이미 에서 발췌한 정확한 코드를 제시했지만 latex.ltx아마도 누군가는 다음 추가 설명도 유용하다고 생각할 것입니다.

환경을 정의할 때 FOOLaTeX는 단순히 두 개의 새로운 명령을 정의합니다 \FOO. \endFOO후자는 항상 인수가 없는 반면 전자는 환경에 대해 지정된 것과 동일한 인수(들)를 갖습니다 FOO. a가 \begin{FOO}발생하면 다음과 같은 일이 발생합니다.

  • 그룹은 \begingroup;로 시작됩니다.

  • \begin( 이 경우) 의 인수는 FOO매크로에 (로컬로) 저장되어 나중에 각각이 올바른 와 쌍을 이루는 \@currenvir지 확인할 수 있습니다 .\end\begin

  • 명령은 \FOO마지막으로 실행됩니다. 따라서 뒤에 오는 인수 \begin{fOO}가 있는 경우 해당 인수를 흡수합니다 .

반면에 LaTeX를 사용하면 \end{FOO}다음과 같은 일이 발생합니다.

  • \endFOO정의된 경우 실행됩니다(위에서 이미 설명한 것처럼 그렇지 않은 경우 아무 일도 일어나지 않습니다).

  • LaTeX는 인수가 다음 \end과 같은지 확인 \@currenvir 하고 그렇지 않으면 오류를 발생시킵니다.

  • \endgroup그룹을 닫으려면 an 이 발행됩니다.

실제로 다른 표준 환경을 기반으로 새 환경을 정의할 때 값이 변경되지 않도록 명시적인 \begin및 를 사용하지 않는 것을 선호합니다 . 예를 들어, 내용을 이탤릭체로 표시하는 환경 의 변형을 정의하고 싶다고 가정해 보겠습니다 . 나는 다음을 선호한다.\end\@currenvirquote

\newenvironment{italquote}{%
  \quote
  \itshape
}{\endquote}

~ 위에

\newenvironment{italquote}{%
  \begin{quote}%
  \itshape
}{\end{quote}}

특히 내가 직접 환경을 사용하지 않을 경우에는 더욱 그렇습니다. 이런 방식으로 사용자가 명령문에서 환경 이름을 잘못 입력하면 사용자가 인식할 수 없는 \end잘못 종료된 환경에 대한 오류가 italquote아니라 실제로 사용했던 잘못 종료된 환경에 대한 오류가 발생합니다.quote

관련 정보