フォントサイズ環境は存在しますか?

フォントサイズ環境は存在しますか?

間違いなく、フォントサイズスイッチは制御シーケンスの形で存在します(ここしかし、時々、それらの環境バージョンが使用されているコード例に遭遇しました。たとえば、 。\begin{small}...\end{small}それらを正常にテストした後、私はそれらを TeX 語彙に組み込み始めました。

数日前、@GonzaloMedina が私の回答の 1 つに、そのような環境は存在せず、それらに依存する構造はまったくの偶然で機能するとコメントしました。そこで、私はそれらの不吉な環境についてさらに調べようとしました。不吉なのは、何らかの形で文書化されていないように見えるからです。(それらを何らかの形で体系的に説明しようとした唯一のものは、Wikibooks のリソースでした。)

これらの環境は現実のものでしょうか?

答え1

LaTeXで定義された任意のコマンドを使用し\newcommand、その周りにペアをラップすることができます\begin{}...\end{}が、これは環境ではないため、推奨されません。

しかし興味深いのは、グループ化はとにかく機能するが、これは の結果であるということです\begin...\end

etc\begin{small}が存在しないため、etc のような fontsize 環境は存在しません。\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}が呼び出されることがわかりますが、これは\foo定義されているため偽であり、environment名前fooが設定され、\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}

\end...環境は、ここでは というコードを探します\endfoo。これは定義されていませんが、\csname endfoo\endcsnameに展開され\relax、何も悪いことは起こりません。

よく知られている環境の多くは では定義されていないことに注意してください。コマンドと を\newenvironment使用すれば十分です。たとえば、やなどを参照してください。\foo\def\endfoo\endequation\endenumerate

答え2

任意のコマンドを環境として使用することができ、大きなテキストブロックを囲む場合は便利なことが多いので、

{\small  zzz\par}

そして

\begin{small}%
zzzz

\end{small}

多かれ少なかれ同等です。

ただし、 とは異なり、通常の TeX トークン化ルールにより、\smallの後のスペースは削除されないことに注意してください。また、の前にはほとんどの場合 または空行が必要です。これはコマンド形式でも当てはまりますが、 などのほとんどのカスタム環境では終了コードに が暗黙的に含まれているため、環境形式では忘れやすくなりますが、ここではそうではありません。\begin{small}\par\endcenter\par

以下の議論も参照してください:

\end.... マクロ名は LaTeX2e で予約されていますか?

答え3

実際、「LaTeXbook」(正確には「LaTeX. 文書作成システム」、Leslie Lamport 著)では、このような環境の使用を推奨しています。27 ページの最後に、次のように書かれています。

すべての宣言には、同じ名前(文字を除く)の対応する環境があります\

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

は と入力するのと同じです{\em ... }

特に、「環境」形式では、環境では常にそうなるように、宣言の効果をローカルに保つためにグループが自動的に提供されます(、および対応する が\begin発行されます)。 は宣言であるため、上記が適用されます。\begingroup\end\endgroup\small

これは意図的に行われたため、これらの環境が「偶然」に機能すると言うのは正しいとは思いません。実際、すでに述べたように、 like コマンドの定義がなくても\endsmall問題は発生しません。これは、 as として呼び出され、したがってif undefined\csname small\endcsnameと同等であるためです。\relax

したがって、最終的に私の答えは、「はい、これらの環境は「本物」です」(それが何を意味するかはともかく)です。


追加

いくつかのコメントを見た後、LaTeX2e で環境がどのように実装されているかについて詳細を追加すると役立つかもしれないと思いました (十分な専門知識がないため、LaTeX3 については触れません)。Christian Hupfer はすでに からの正確なコード抜粋を提示していますlatex.ltxが、おそらく次の追加のコメントも役立つと思われる人がいるでしょう。

環境 を定義すると、LaTeX はとというFOO2 つの新しいコマンドを定義します。後者は常に引数なしですが、前者は、環境 に指定されている場合は、同じ引数を持ちます。 に遭遇すると、次のようなことが起こります (他にも起こります):\FOO\endFOOFOO\begin{FOO}

  • グループは から始まります\begingroup

  • \begin(この場合は)の引数はFOOマクロ に(ローカルに) 保存され、後で各 が正しい とペアになっている\@currenvirかどうかを確認できます。\end\begin

  • コマンド\FOOは最後に実行されるため、後続の引数\begin{fOO}が存在する場合はそれが吸収されます。

一方、LaTeX の場合\end{FOO}、次のようなことが起こります (他にも次のようなことが起こります)。

  • \endFOO定義されている場合は実行されます (上で説明したように、定義されていない場合は何も起こりません)。

  • LaTeX は の引数\endが に等しいかどうかをチェックし\@currenvir 、等しくない場合はエラーを発生させます。

  • \endgroupグループを閉じるために が発行されます。

実際、別の標準環境に基づいて新しい環境を定義する場合、の値が変更されないように、\beginと を明示的に使用することは避けます。たとえば、内容を斜体化する環境のバリアントを定義したいとします。私は次のようにします。\end\@currenvirquote

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

以上

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

特に、自分で環境を使用しない場合はそうです。このようにして、ユーザーがステートメント内で環境の名前を誤って入力した場合、ユーザーが気付いていない可能性のある誤って終了した環境に関するエラーではなく、実際に使用した誤って終了した環境に関する\endエラーが表示されます。italquotequote

関連情報