LaTeX環境作成の裏技:\newenvironmentと\renewenvironment以外の代替手法を徹底比較

2025-05-27

LaTeXの環境(Environment)とは?

LaTeXでは、特定の書式設定や構造を持つテキストブロックを「環境(Environment)」と呼びます。例えば、箇条書き(itemize)、番号付きリスト(enumerate)、中央揃え(center)、図(figure)、表(table)などが標準で用意されている環境です。

環境は通常、\begin{環境名}で始まり、\end{環境名}で終わります。この開始タグと終了タグの間に書かれた内容が、その環境によって定義された書式で出力されます。

\newenvironment:新しい環境を定義する

\newenvironmentコマンドは、新しい環境をゼロから定義するために使われます。これにより、独自のレイアウトやフォーマットを持つテキストブロックを作成できます。

構文

\newenvironment{環境名}[引数の数][オプション引数のデフォルト値]{開始時の処理}{終了時の処理}

各引数の意味は以下の通りです。

  • 終了時の処理: 環境が終了したとき(\end{環境名}が呼び出されたとき)に実行されるLaTeXコード。
  • 開始時の処理: 環境が開始されたとき(\begin{環境名}が呼び出されたとき)に実行されるLaTeXコード。
  • [オプション引数のデフォルト値] (オプション): 1番目の引数をオプション引数にする場合に指定します。この引数が省略された場合に適用されるデフォルト値を記述します。この引数を指定すると、[引数の数]は自動的に1つ増えたものとして扱われます(つまり、オプション引数が#1となり、それ以降の必須引数は#2からになります)。
  • [引数の数] (オプション): 環境が受け取る引数の数(1から9まで)。引数を取る場合、その数値を指定します。環境内で引数は#1, #2, ...のように参照できます。引数がない場合はこの部分を省略します。
  • 環境名: 定義する新しい環境の名前。この名前を\begin{環境名}\end{環境名}で使用します。

使用例

例えば、赤い太字で「注意:」という見出しが付く警告ボックスのような環境を定義してみましょう。

\documentclass{article}
\usepackage{xcolor} % 色を使うために必要

\newenvironment{warningbox}{%
  \par\vspace{\baselineskip}%
  \noindent\color{red}\textbf{注意:}\quad\ignorespaces%
}{\par\vspace{\baselineskip}}

\begin{document}

これは通常のテキストです。

\begin{warningbox}
  この内容は非常に重要です。注意深く読んでください。
\end{warningbox}

別の警告です。

\begin{warningbox}
  締め切りは来週の金曜日です。
\end{warningbox}

\end{document}

この例では、warningbox環境が開始されると、改行、垂直方向のスペース、赤い文字色、太字の「注意:」というテキストが挿入されます。終了時には、再度改行と垂直方向のスペースが挿入されます。

\renewenvironmentコマンドは、**既に定義されている環境の動作を変更する(再定義する)**ために使われます。これは、既存の環境のデフォルトの見た目や挙動が気に入らない場合に便利です。

構文

\newenvironmentとまったく同じ構文を使用します。

\renewenvironment{環境名}[引数の数][オプション引数のデフォルト値]{開始時の処理}{終了時の処理}

注意点

  • 組み込みの環境を再定義する際には、予期せぬ副作用が生じる可能性があるため、慎重に行う必要があります。
  • \renewenvironmentを使用する際は、既にその名前の環境が定義されている必要があります。 存在しない環境を再定義しようとするとエラーになります。

使用例

例えば、標準のitemize環境の箇条書きの記号をデフォルトの黒丸(\textbullet)から別の記号に変更したいとします。

\documentclass{article}
\usepackage{pifont} % 特殊な記号を使うために必要

% itemize環境を再定義
\renewenvironment{itemize}{%
  \begin{list}{\ding{110}}{% % \ding{110}は星の記号
    \setlength{\itemsep}{0pt}%
    \setlength{\parskip}{0pt}%
    \setlength{\parsep}{0pt}%
    \setlength{\topsep}{0pt}%
    \setlength{\partopsep}{0pt}%
    \setlength{\leftmargin}{1.5em}%
    \setlength{\labelwidth}{1.0em}%
    \setlength{\labelsep}{0.5em}%
  }%
}{\end{list}}

\begin{document}

これは通常の`itemize`環境です(再定義されています)。
\begin{itemize}
  \item 項目1
  \item 項目2
    \begin{itemize}
      \item ネストされた項目
    \end{itemize}
  \item 項目3
\end{itemize}

\end{document}

この例では、\renewenvironmentを使ってitemize環境を再定義し、箇条書きの記号を星に変更しています。また、リストの間隔も細かく調整しています。

  • \renewenvironment: 既存の環境を**変更(上書き)**します。既に定義されている環境に対して使います。
  • \newenvironment: 新しい環境を作成します。まだ存在しない環境に対して使います。


LaTeXで新しい環境を定義したり、既存の環境を再定義したりする際には、いくつか注意すべき点があります。これらのコマンドは非常に強力ですが、構文の誤りや予期せぬ挙動によりエラーが発生することがあります。

エラーメッセージの理解

まず、LaTeXがエラーを出力した際には、そのメッセージをよく読むことが重要です。エラーメッセージは多くの場合、問題の場所(行番号)や原因に関するヒントを含んでいます。

  • ! Missing } inserted.
    • 波括弧 {} や角括弧 [] の閉じ忘れ、または不正な文字が含まれている場合に発生しやすいエラーです。特に\newenvironmentの開始処理や終了処理の定義部分でよく見られます。
  • ! LaTeX Error: \begin{環境名} on input line X ended by \end{別の環境名}.
    • 環境の開始タグと終了タグが一致していない場合に発生します。タイプミスがないか確認しましょう。
  • ! LaTeX Error: Environment <環境名> undefined. (for \renewenvironment)
    • \renewenvironmentを使って既存の環境を再定義しようとしたが、その環境名がまだ定義されていない場合に発生します。この場合は、\newenvironmentを使うべきです。あるいは、再定義しようとしている環境が、使用しているドキュメントクラスやパッケージによってまだ読み込まれていない可能性があります。
  • ! LaTeX Error: Command \環境名 already defined. (for \newenvironment)
    • \newenvironmentを使って新しい環境を定義しようとしたが、その環境名が既に存在する場合に発生します。この場合は、\renewenvironmentを使うべきです。
  • ! LaTeX Error: Environment <環境名> undefined.
    • \begin{環境名}または\end{環境名}がどこかで使われているが、その環境名\newenvironment\renewenvironmentで定義されていない場合に発生します。

よくあるエラーと解決策

\newenvironmentで既存の環境名を指定してしまう

エラー
! LaTeX Error: Command \section already defined. のようなエラー。 (実際には環境名として表示されますが、根本は同じです。)

原因
\newenvironment{section}{...}{...} のように、LaTeXが既に定義している環境(例: section, itemize, figureなど)の名前を使って新しい環境を定義しようとすると発生します。\newenvironmentは「新しい」環境を作るためのコマンドだからです。

解決策
既に存在する環境の名前を変更したい場合は、\renewenvironmentを使用します。

% 誤った例
% \newenvironment{itemize}{...}{...}

% 正しい例(既存環境の再定義)
\renewenvironment{itemize}{...}{...}
\renewenvironmentで存在しない環境名を指定してしまう

エラー
! LaTeX Error: Environment mycustomenv undefined.

原因
\renewenvironmentを使って再定義しようとした環境(例: mycustomenv)が、その時点でまだ定義されていない場合に発生します。

解決策
その環境が本当に存在しない場合は、\newenvironmentを使って新しく定義します。もし存在するはずの環境であれば、その環境を定義するパッケージが\usepackageで読み込まれているか、またはドキュメントクラスが正しく指定されているかを確認します。\renewenvironmentの呼び出し位置が、対象の環境が定義された後になっているかも確認しましょう。

波括弧 {} の対応関係の不一致

エラー
! Missing } inserted. ! Extra }

原因
\newenvironment\renewenvironmentの定義部分で、開始時の処理や終了時の処理を囲む波括弧 {} の対応が取れていない場合に最も頻繁に発生するエラーです。また、オプション引数や必須引数の指定方法に誤りがある場合にも起こりえます。

解決策
定義しているコードを注意深く確認し、すべての波括弧が正しく閉じられているか確認します。特に、複雑なマクロを中に記述する場合に起こりやすいので、一つずつ確認するか、シンプルな形で定義してみてから徐々に複雑な内容を追加していくと良いでしょう。

% 誤った例 (閉じ括弧がない)
\newenvironment{myenv}{
  \textbf{開始}
}{
  \textit{終了} % ここに閉じ括弧がない場合
}

% 正しい例
\newenvironment{myenv}{%
  \textbf{開始}%
}{%
  \textit{終了}%
}

コメントアウト記号 % を行末に付けることで、改行による余計なスペースが入るのを防ぐことができます。これもトラブルシューティングでは重要です。

環境の引数の使用方法の誤り

エラー
! Illegal parameter number in definition of \環境名. ! Argument of \環境名 has an extra }.

原因
\newenvironmentの定義で引数の数を指定したにもかかわらず、その引数(#1, #2など)を正しく使っていないか、または引数を指定していないのに#1などを使ってしまっている場合に発生します。また、\end{環境名}の終了処理の中では引数を使用できないという制約があります。

解決策

  • \end{環境名}の終了処理部には引数を使用できません。 これは、\end{環境名}が呼ばれた時点では、環境内のテキストが処理された後であり、引数の情報が失われているためです。もし終了処理で引数を使いたい場合は、etoolboxパッケージの\AfterEndEnvironmentなどのフック機能を使うか、環境の本体内で引数をマクロとして保存し、それを終了処理で呼び出すなどの工夫が必要です。
  • オプション引数を指定した場合、それは常に#1となり、その後の必須引数は#2からになります。
  • 必須引数は#1, #2, ...のように連番でアクセスします。
  • 引数の数を正しく指定しているか確認します。
% 誤った例 (終了処理で引数を使用)
\newenvironment{titledbox}[1]{%
  \section*{#1}%
  \begin{quote}%
}{%
  \end{quote}%
  % ここで #1 を使おうとするとエラーになる
}

% 解決策の例(引数を終了処理で使いたい場合)
% (この場合は、環境の開始時に引数をグローバルマクロに保存するなどの工夫が必要)
\documentclass{article}
\usepackage{etoolbox} % \AfterEndEnvironment を使用するために必要

\newenvironment{titledbox}[1]{%
  \def\currenttitle{#1}% 引数を一時的に保存
  \section*{\currenttitle}%
  \begin{quote}%
}{%
  \end{quote}%
  \par\noindent\small --- \currenttitle\ の終わり --- % 保存した引数を使用
}

\begin{document}

\begin{titledbox}{私の素敵なボックス}
  このボックスには、様々な内容が書かれています。
  ボックスのタイトルを下に表示します。
\end{titledbox}

\end{document}
パッケージの読み込み順序や競合

エラー
特定のパッケージと一緒に使うとエラーになる、または期待通りに動作しない。

原因
\newenvironment\renewenvironmentで定義した内容が、他のパッケージが提供するコマンドや環境と競合している可能性があります。特に、複雑なマクロや内部的なコマンドを操作する環境を定義した場合に発生しやすいです。

解決策

  • \makeatletter\makeatotherが必要な場合: LaTeXの内部コマンド(通常、@を含む名前)を使用する場合、それらのコマンドが使えるように\makeatletter\makeatotherで囲む必要があります。
  • ログファイル(.log)を詳細に確認し、どの時点でエラーが発生しているか、どのような警告が出ているかを把握します。
  • 競合している可能性のあるパッケージを一時的にコメントアウトして、問題が解決するかどうか確認します。
  • パッケージの読み込み順序を変更してみる。特定のパッケージが別のパッケージの機能を上書きするような場合に影響が出ることがあります。
  • 関連するパッケージがすべて読み込まれているか確認します。
% 例: 内部コマンドを使用する場合
\makeatletter
\newenvironment{myinternalenv}{%
  \@startsection{subsection}{2}{\z@}{.5\baselineskip \@plus.2ex \@minus.2ex}{.5\baselineskip \@plus.2ex}{\normalfont\bfseries}%
}{%
  \par
}
\makeatother
スペースの制御(%の利用)

問題
定義した環境の上下や前後に意図しない余分なスペースが入る。

原因
LaTeXは、ソースコード中の改行やスペースをテキストの区切りと見なし、場合によっては余分な空白として処理します。\newenvironment\renewenvironmentの定義内で、コマンドの直後に改行がある場合に、その改行がスペースとして解釈されることがあります。

解決策
コマンドの直後に改行がある場合、その改行を無視させるために行末に%(コメントアウト記号)を置きます。

% 誤った例 (余分なスペースが入る可能性)
\newenvironment{mybox}{
  \fbox{
    \begin{minipage}{\linewidth}
}{
    \end{minipage}
  }
}

% 正しい例 (行末に%を付けて余分なスペースを抑制)
\newenvironment{mybox}{%
  \fbox{%
    \begin{minipage}{\linewidth}%
}{%
    \end{minipage}%
  }%
}

トラブルシューティングの一般的なヒント

  1. MWE (Minimal Working Example) の作成
    エラーが発生した場合、問題の環境定義とその環境を使用した最小限のコード(MWE)を作成します。これにより、問題の原因を特定しやすくなります。不要なパッケージやテキストを削除し、エラーが再現される最小のファイルを作成します。

  2. ログファイルの確認
    コンパイル後に生成される.logファイルを必ず確認します。エラーメッセージの詳細や、警告(LaTeX Warning)が記載されています。エラーが最初に出現した場所から原因を特定できることが多いです。

  3. incremental development (段階的な開発)
    複雑な環境を定義する際は、一度にすべてを記述するのではなく、シンプルな定義から始めて、少しずつ機能を追加していくと良いでしょう。どこで問題が発生したかを特定しやすくなります。

  4. オンラインリソースの活用
    TeX Stack ExchangeのようなQ&Aサイトや、OverleafなどのLaTeXドキュメントサイトには、多くの解決策や例が掲載されています。エラーメッセージをそのまま検索するのも有効です。



\newenvironment は、まだ定義されていない新しい環境を作成するために使います。

構文

\newenvironment{環境名}[引数の数][オプション引数のデフォルト値]{開始時の処理}{終了時の処理}

例1:シンプルな注意書きボックス

引数なしで、赤い太字の「注意!」という見出しが付くボックスを作成します。

\documentclass{article}
\usepackage{xcolor} % 色を使うために必要

% 新しい環境 'attentionbox' を定義
\newenvironment{attentionbox}{%
  \par\vspace{\baselineskip}% % 前にスペースを入れる
  \noindent\color{red}\textbf{注意!}\quad\ignorespaces% % 赤い太字で「注意!」を表示し、直後のスペースを無視
}{%
  \par\vspace{\baselineskip}% % 後にスペースを入れる
}

\begin{document}

これは通常のテキストです。

\begin{attentionbox}
  このボックス内のテキストは特に重要です。
  必ずお読みください。
\end{attentionbox}

通常のテキストが続きます。

\end{document}

解説

  • { 終了時の処理 }: \end{attentionbox} が呼ばれたときに実行されます。
    • \par\vspace{\baselineskip}: 新しい段落を開始し、垂直スペースを入れます。
  • { 開始時の処理 }: \begin{attentionbox} が呼ばれたときに実行されます。
    • \par\vspace{\baselineskip}: 新しい段落を開始し、基本的な行間分の垂直スペースを入れます。
    • \noindent: 段落のインデントをなくします。
    • \color{red}\textbf{注意!}\quad: テキストの色を赤にし、太字で「注意!」と表示し、その後に少しスペース(\quad)を入れます。
    • \ignorespaces: このコマンドの直後に続く空白(例えば、ソースコードの改行によるもの)を無視します。これにより、環境内のテキストが意図しないインデントやスペースで始まらないようにします。
  • \newenvironment{attentionbox}: attentionbox という名前の環境を定義します。

例2:タイトル付きの引用ボックス(必須引数あり)

引用元を示すタイトルを引数として受け取る引用環境を作成します。

\documentclass{article}
\usepackage{lipsum} % ダミーテキストのために使用

% 新しい環境 'myquote' を定義(引数1つ)
\newenvironment{myquote}[1]{%
  \begin{quote}% 既存のquote環境を開始
  \textbf{--- #1 ---}\par% 引数 #1 を太字で表示し、改行
  \small\itshape% テキストを小さく、斜体に
}{%
  \end{quote}% 既存のquote環境を終了
}

\begin{document}

\lipsum[1] % ダミーテキスト

\begin{myquote}{アルベルト・アインシュタイン}
  知恵の真のしるしは知識ではなく、想像力である。
\end{myquote}

\lipsum[2] % ダミーテキスト

\begin{myquote}{スティーブ・ジョブズ}
  ハングリーであれ。愚かであれ。
\end{myquote}

\end{document}

解説

  • \end{quote}: 環境の終了時にquote環境を閉じます。
  • \small\itshape: その後のテキストを小さく、斜体にします。
  • \textbf{--- #1 ---}\par: 渡された引数(引用元)を太字で表示し、改行します。
  • \begin{quote}: 環境の開始時にLaTeX標準のquote環境を開始します。これにより、インデントされたブロックが作成されます。
  • \newenvironment{myquote}[1]: myquote 環境を定義し、1つの必須引数を受け取ります。この引数は環境内で#1として参照できます。

例3:背景色付きのボックス(オプション引数と必須引数)

背景色とタイトルを柔軟に指定できるボックス環境を作成します。

\documentclass{article}
\usepackage{xcolor}
\usepackage{calc} % \widthof{} を使うために必要

% オプション引数と必須引数を持つ新しい環境 'coloredbox' を定義
% オプション引数(色)のデフォルト値は 'lightgray'
\newenvironment{coloredbox}[2][lightgray]{%
  \par\vspace{\baselineskip}%
  \noindent\fcolorbox{black}{#1}{% % 外枠を黒、背景色を引数 #1 で指定
    \begin{minipage}{\linewidth-2\fboxsep-2\fboxrule}% minipageの幅を調整
      \centering%
      \textbf{#2}\par\vspace{0.5\baselineskip}\hrule% 引数 #2 を太字で中央揃えし、区切り線
      \normalsize% 文字サイズをリセット
}{%
    \end{minipage}%
  }\par\vspace{\baselineskip}%
}

\begin{document}

\begin{coloredbox}{お知らせ}
  本日、午後3時より会議室Bにて臨時会議を行います。
  ご参加のほどよろしくお願いいたします。
\end{coloredbox}

\begin{coloredbox}[yellow]{重要事項}
  締め切りは来週の金曜日です。
  期日までに提出を完了してください。
\end{coloredbox}

\end{document}

解説

  • \textbf{#2}\par\vspace{0.5\baselineskip}\hrule: 必須引数#2(タイトル)を太字で中央揃えし、その下に区切り線(\hrule)を引きます。
  • \begin{minipage}{\linewidth-2\fboxsep-2\fboxrule}: ボックスの内部にminipage環境を作成し、その幅を調整します。\fboxsep\fboxruleはボックスの余白と線の太さを表す寸法です。
  • \fcolorbox{black}{#1}: fcolorbox は枠と背景色を指定できるボックスを作成します。ここでは、枠の色を黒、背景色をオプション引数#1で指定します。
  • \newenvironment{coloredbox}[2][lightgray]:
    • coloredbox という名前の環境を定義します。
    • [2]: 2つの引数を受け取ります。
    • [lightgray]: 1番目の引数をオプション引数とし、デフォルト値をlightgrayとします。
    • この場合、オプション引数が#1、必須引数が#2として環境内で利用できます。

\renewenvironment は、LaTeXに既に定義されている環境の動作や見た目を変更するために使います。構文は\newenvironmentと同じです。

例4:itemize 環境の箇条書き記号を変更する

デフォルトの黒丸(\textbullet)ではなく、別の記号(例: 星)を使用するようにitemize環境を再定義します。

\documentclass{article}
\usepackage{pifont} % 特殊な記号 \ding{} を使うために必要
\usepackage{enumitem} % リスト環境のカスタマイズに便利

% itemize 環境を再定義
\renewenvironment{itemize}{%
  \begin{itemize}[label=\ding{110}] % enumitem パッケージの機能で記号を星に変更
    \setlength{\itemsep}{0pt}% % 各項目の間隔を詰める
    \setlength{\parskip}{0pt}% % 段落間のスペースを詰める
    \setlength{\parsep}{0pt}% % 段落内のスペースを詰める
}{\end{itemize}}

\begin{document}

これは通常のリストですが、再定義されています。
\begin{itemize}
  \item 項目1
  \item 項目2
    \begin{itemize} % ネストされたリストも新しい記号になる
      \item ネストされた項目A
      \item ネストされた項目B
    \end{itemize}
  \item 項目3
\end{itemize}

\end{document}

解説

  • \setlength{...}{0pt}: itemize環境の各項目や段落間の余分なスペースを0ptに設定して詰めます。
  • \begin{itemize}[label=\ding{110}]: enumitemパッケージの機能で、labelオプションを使って箇条書き記号を\ding{110}に設定します。
  • \renewenvironment{itemize}: 既存のitemize環境を再定義します。
  • \usepackage{enumitem}: リスト環境をより簡単にカスタマイズできる便利なパッケージです。
  • \usepackage{pifont}: 箇条書き記号として使用する\ding{110}(星の記号)を提供します。

例5:abstract 環境のタイトルを中央揃えにする

標準のabstract環境は、タイトルが左寄せになります。これを中央揃えに再定義します。

\documentclass{article}

% abstract 環境を再定義
% 通常、abstract 環境はドキュメントのプリアンブルで自動的に定義されるため、
% ここで \renewenvironment を使うのが適切です。
\renewenvironment{abstract}{%
  \small%
  \begin{center}%
  \bfseries\abstractname\end{center}% % abstractname(通常は"Abstract")を太字で中央揃え
  \quotation% % 引用のように左右にインデント
}{\endquotation} % 引用の終了

\begin{document}

\title{私の素晴らしい論文}
\author{山田 太郎}
\date{\today}
\maketitle

\begin{abstract}
  この論文では、LaTeXにおける環境の定義と再定義について、その基本的な使い方と応用例を詳細に解説します。特に、`\newenvironment`と`\renewenvironment`の具体的なコード例を通じて、読者がこれらの強力な機能を効果的に利用できるよう支援します。
\end{abstract}

\section{はじめに}
これは論文の本文です。

\end{document}
  • \endquotation: quotation環境を閉じます。
  • \quotation: テキストブロックを左右にインデントするquotation環境を開始します。
  • \begin{center}\bfseries\abstractname\end{center}: \abstractname(ドキュメントクラスによって「Abstract」や「要旨」などと定義されているコマンド)を太字で中央に配置します。
  • \small: 抽象のテキストを少し小さくします。
  • \renewenvironment{abstract}: 既存のabstract環境を再定義します。


\newcommand / \renewcommand を用いた簡易的なブロック定義

環境(\begin{...}\end{...})ほどの構造は必要ないが、特定の書式を適用したいテキストブロックがある場合、\newcommand\renewcommand を使ってマクロを定義し、そのマクロの引数としてテキストブロック全体を渡す方法があります。

利点

  • 環境の開始・終了タグが不要なため、インラインでの使用や、より柔軟な配置が可能です。
  • 非常にシンプルな書式変更であれば、環境を定義するよりも簡潔に記述できます。

欠点

  • 複数行の引数を受け取れない場合があります(xparse パッケージなどを使えば解決できます)。
  • 複数段落にわたるような長いテキストブロックには不向きな場合があります(parboxminipage を組み合わせれば可能ですが、複雑になります)。
  • \begin{...}\end{...} のような構造的な整合性がありません。


赤い太字の警告テキストをマクロで定義

\documentclass{article}
\usepackage{xcolor}

% \warningText という新しいコマンドを定義(引数1つ)
\newcommand{\warningText}[1]{\color{red}\textbf{注意!}\quad #1}

\begin{document}

これは通常のテキストです。

\warningText{この内容は非常に重要です。注意深く読んでください。}

別の警告です。

\warningText{締め切りは来週の金曜日です。}

\end{document}

この例では、\warningText コマンドに直接警告文を渡すだけで、スタイルが適用されます。

\newtheorem (定理環境の定義)

数学的な文書や学術論文で、定理、定義、補題などのナンバリングされた環境を定義する場合、\newenvironment ではなく、\newtheorem を使用するのが一般的です。\newtheorem は自動的なナンバリング、スタイルのカスタマイズなど、定理環境に特化した機能を提供します。

利点

  • amsthm パッケージと組み合わせることで、多様なスタイル(イタリック体、ボールド体など)を簡単に適用できます。
  • セクションやチャプターごとに番号をリセットしたり、他の定理環境と番号を共有したりできます。
  • 自動的な通し番号の管理が容易です。

構文

\newtheorem{環境名}{表示名}[親カウンタ]
\newtheorem{環境名}[共有カウンタ]{表示名}


定理と定義を定義する

\documentclass{article}
\usepackage{amsthm} % 定理環境のスタイル設定に便利

% 定理環境を定義
\newtheorem{theorem}{定理}[section] % sectionごとに番号をリセット
\newtheorem{definition}{定義}[section] % definitionもsectionごとに番号をリセット
\newtheorem{lemma}[theorem]{補題} % 補題も定理と同じカウンタ(theorem)を共有

\begin{document}

\section{はじめに}

\begin{theorem}
  すべての偶数は2で割り切れる。
\end{theorem}

\begin{definition}
  素数とは、1とその数自身以外に正の約数を持たない自然数のことである。
\end{definition}

\begin{theorem}
  素数は無限に存在する。
\end{theorem}

\begin{lemma}
  任意の2つの偶数の和は偶数である。
\end{lemma}

\end{document}

environ パッケージ

environ パッケージは、環境の本体(\begin{...}\end{...} の間のコンテンツ)を \BODY というマクロとしてキャプチャする機能を提供します。これにより、環境の定義内で環境のコンテンツを柔軟に操作できるようになります。通常の \newenvironment では、環境の開始処理でしか引数を参照できませんが、\BODY を使うことで環境の終了処理や、環境のコンテンツを処理する中でコンテンツ自体にアクセスできます。

利点

  • \begin\end の間で渡される引数を、\BODY にアクセスすることで利用できます(通常の\newenvironmentの終了処理では引数にアクセスできない制約を回避できます)。
  • 環境のコンテンツ全体をマクロとして扱えるため、コンテンツを複数回使用したり、特定の処理を適用したりすることが容易になります。

構文

\usepackage{environ}
\NewEnviron{環境名}[引数の数][オプション引数のデフォルト値]{
  % 環境の開始時の処理
  % \BODY を使って環境のコンテンツにアクセスできる
}


環境のコンテンツを枠で囲み、前後にタイトルとフッターを表示する

\documentclass{article}
\usepackage{environ}
\usepackage{xcolor}
\usepackage{lipsum} % ダミーテキストのため

% environパッケージを使って新しい環境 'framedbox' を定義
\NewEnviron{framedbox}[1]{%
  \par\vspace{\baselineskip}%
  \centering%
  \fcolorbox{blue}{blue!10}{%
    \begin{minipage}{0.8\linewidth}%
      \textbf{--- #1 ---}\par\vspace{0.5\baselineskip}\hrule\vspace{0.5\baselineskip}%
      \BODY % ここに環境のコンテンツが入る
      \vspace{0.5\baselineskip}\hrule\vspace{0.5\baselineskip}%
      \raggedleft\small (以上、\textbf{#1}でした)%
    \end{minipage}%
  }\par\vspace{\baselineskip}%
}

\begin{document}

\lipsum[1]

\begin{framedbox}{重要な情報}
  \lipsum[2]
  このボックス内の情報は、特に注意を払って確認してください。
\end{framedbox}

\lipsum[3]

\end{document}

解説

  • \BODY: 環境のコンテンツが挿入される場所にこれを記述します。
  • \NewEnviron{framedbox}[1]: framedbox 環境を定義し、1つの必須引数を受け取ります。

tcolorbox パッケージ

tcolorbox パッケージは、装飾的なボックス(背景色、枠、タイトル、角の丸みなど)を簡単に作成できる非常に強力なパッケージです。独自のボックス環境を定義する際に、\newenvironment でゼロからスタイルを記述する代わりに、\newtcolorbox コマンドを使って、豊富なオプションを設定するだけで実現できます。

利点

  • コードリストや定理などの特定の用途に特化した機能も提供します。
  • タイトル、背景色、枠線、余白、影など、豊富なカスタマイズオプションがあります。
  • 非常に多様なデザインのボックスを簡単に作成できます。

構文

\usepackage{tcolorbox}
\newtcolorbox{環境名}[引数の数][オプション引数のデフォルト値]{<tcolorbox options>}


背景色付きのタイトルボックス

\documentclass{article}
\usepackage[most]{tcolorbox} % tcolorboxパッケージを読み込む

% tcolorbox を使って新しい環境 'myfancybox' を定義
\newtcolorbox{myfancybox}[1]{%
  colback=blue!5!white, % 背景色
  colframe=blue!75!black, % フレーム色
  fonttitle=\bfseries\Large, % タイトルのフォント
  title=#1, % タイトルを引数 #1 で指定
  arc=5mm, % 角を丸める
  boxsep=5mm, % ボックス内の余白
  leftrule=1mm, rightrule=1mm, toprule=1mm, bottomrule=1mm % フレームの太さ
}

\begin{document}

\begin{myfancybox}{今日のハイライト}
  今日は天気も良く、LaTeX の新しい環境について学ぶことができました。
  非常に生産的な一日でした!
\end{myfancybox}

\begin{myfancybox}{重要な通知}
  次回の会議は来週の水曜日午前10時です。
  お忘れなくご参加ください。
\end{myfancybox}

\end{document}

etoolbox パッケージのフック機能

etoolbox パッケージは、既存のコマンドや環境の開始・終了時に特定のコードを「フック」する機能を提供します。これにより、\renewenvironment を使って環境全体を再定義するのではなく、既存の環境の挙動にごく一部の変更を加えたい場合に便利です。

利点

  • 特定の環境に対して、統一された前処理・後処理を適用できます。
  • 既存の環境定義を破壊せずに、追加の処理を挿入できます。

主なコマンド

  • \AfterEndEnvironment{環境名}{コード}: 環境の終了タグの処理が完了した直後にコードを実行
  • \BeforeEndEnvironment{環境名}{コード}: 環境の終了タグの処理が始まる直前にコードを実行
  • \AfterBeginEnvironment{環境名}{コード}: 環境の開始タグの処理が完了した直後にコードを実行
  • \BeforeBeginEnvironment{環境名}{コード}: 環境の開始直前にコードを実行


既存の center 環境の前後に追加のテキストを挿入する

\documentclass{article}
\usepackage{etoolbox}
\usepackage{xcolor}

% center環境の開始前と終了後にフックを追加
\BeforeBeginEnvironment{center}{\noindent\color{green!50!black}\hrulefill\quad 中央揃え開始 \quad\hrulefill}
\AfterEndEnvironment{center}{\noindent\color{green!50!black}\hrulefill\quad 中央揃え終了 \quad\hrulefill\par}

\begin{document}

これは通常のテキストです。

\begin{center}
  \textbf{このテキストは中央揃えになります。}\\
  フック機能によって、前後に追加の線とテキストが表示されます。
\end{center}

通常のテキストが続きます。

\end{document}

xparse パッケージ (LaTeX3 の構文)

xparse パッケージは、より強力で柔軟なコマンドおよび環境の定義機能を提供します。特に、引数の種類(必須、オプション、スター付き、複数のオプション引数など)を細かく制御したい場合に非常に有用です。LaTeX3 の一部として開発されており、最新のLaTeXの機能を使う上で重要になります。

利点

  • エラーチェックがより詳細です。
  • 環境の本体(\BODY)へのアクセスをネイティブにサポートします。
  • \newenvironment よりも複雑な引数処理(複数のオプション引数、キーバリューペア引数など)が可能です。

構文

\usepackage{xparse}
\NewDocumentEnvironment{環境名}{<引数指定>}{開始時の処理}{終了時の処理}


\newenvironment 例3 と同等の、背景色付きボックスを xparse で定義

\documentclass{article}
\usepackage{xcolor}
\usepackage{xparse} % xparseパッケージを読み込む

% xparseを使って新しい環境 'coloredboxX' を定義
% o: オプション引数 (デフォルト値なし), m: 必須引数
% +b: 環境本体(body)を\BODYとして取得
\NewDocumentEnvironment{coloredboxX}{o m +b}{%
  \par\vspace{\baselineskip}%
  \IfValueTF{#1}{% オプション引数 #1 が指定された場合
    \noindent\fcolorbox{black}{#1}{%
  }{% オプション引数 #1 が指定されない場合(デフォルトはlightgray)
    \noindent\fcolorbox{black}{lightgray}{%
  }%
    \begin{minipage}{\linewidth-2\fboxsep-2\fboxrule}%
      \centering%
      \textbf{#2}\par\vspace{0.5\baselineskip}\hrule% 必須引数 #2 をタイトルとして表示
      \normalsize%
      #3 % 環境のコンテンツ \BODY
}{%
    \end{minipage}%
  }\par\vspace{\baselineskip}%
}

\begin{document}

\begin{coloredboxX}{お知らせ}
  本日、午後3時より会議室Bにて臨時会議を行います。
  ご参加のほどよろしくお願いいたします。
\end{coloredboxX}

\begin{coloredboxX}[yellow]{重要事項}
  締め切りは来週の金曜日です。
  期日までに提出を完了してください。
\end{coloredboxX}

\end{document}
  • \NewDocumentEnvironment{coloredboxX}{o m +b}:
    • o: 最初の引数がオプション引数([])であることを示します。\IfValueTF{#1}{...}{...} で値の有無をチェックできます。
    • m: 次の引数が必須引数({})であることを示します。
    • +b: 環境の本体が「バランスの取れたブロック(balanced block)」としてキャプチャされ、#3 または \BODY (これは#3に相当)として利用可能になります。