📄

LaTeXでmulticols環境内にいるかどうかの判定を行う方法

2024/10/09に公開

はじめに

LaTeX のmulticols環境内で、figure環境などのfloatオブジェクトや\marginparを含む環境を使用しようとすると、以下のエラーが発生します。

そのため、画像を挿入するコマンドを一元化したい場合などにおいては、multicols環境内にいるかどうかを判定して例外処理を行う必要があります。しかし、multicols環境内かどうかを条件として処理を変更したい場合、LaTeXには標準の方法が存在しないため、工夫が必要です。

ここでは、multicols環境に入った際にフラグを立て、終了時にフラグをリセットすることで、multicols環境内かどうかを判定する方法を紹介します。このフラグを使うことで、環境内と環境外で異なる処理を行うことができます。

実装方法

フラグの初期化

\newif\ifinmulticols
\inmulticolsfalse

これにより、\ifinmulticolsフラグが作成され、初期状態はfalse(環境外)になります。

multicols環境の再定義:

\let\oldbeginmulticols\multicols
\let\oldendmulticols\endmulticols

\def\multicols#1{
    \inmulticolstrue
    \oldbeginmulticols{#1}
}

\def\endmulticols{
    \oldendmulticols
    \inmulticolsfalse
}

\letを使って元のmulticols環境を保存し、\multicols\endmulticolsを再定義しています。multicols環境の開始時に \inmulticolstruetrueに設定し、終了時に\inmulticolsfalsefalseに設定します。

使い方

\ifinmulticols
    % Multicols環境内での処理
\else
    % Multicols環境外での処理
\fi

サンプルコード

\documentclass{article}
\usepackage{multicol}

% multicols環境内フラグを初期化
\newif\ifinmulticols
\inmulticolsfalse

% multicols環境の再定義
\let\oldbeginmulticols\multicols
\let\oldendmulticols\endmulticols

\def\multicols#1{
    \inmulticolstrue % フラグを立てる
    \oldbeginmulticols{#1}
}

\def\endmulticols{
    \oldendmulticols
    \inmulticolsfalse % フラグをリセット
}

% multicols環境内かどうかのメッセージを表示するマクロ
\newcommand{\multicolsstatus}{
    \ifinmulticols
        Multicols環境内です。
    \else
        Multicols環境外です。
    \fi
}
\begin{document}

\multicolsstatus

\begin{multicols}{2}
    \multicolsstatus
\end{multicols}

\multicolsstatus

\end{document}

まとめ

以上の方法により、multicols 環境内かどうかを簡単に判定し、それに応じた処理を行うことが可能になります。multicols 環境の動作を再定義することで、フラグを活用し、複数カラムの中での処理と通常の処理を分けることができるようになります。

特に複雑なレイアウトや特殊な要件を持つ文章では、このようなフラグを使った制御が非常に便利です。ぜひ、必要に応じて活用してみてください。

Discussion