パッケージ間の干渉

パッケージ間の干渉

- Tetsuo Tamai の投稿
返信数: 8
TexliveのWindows版を使っています.Latex一般におそらくよく起こることではないかと思いますが,使っているスタイルのパッケージ同士が干渉しているらしいことで生じるエラーに,どう対処したらよいか悩んでいます.具体的にはTexliveであらかじめサポートされているnccmathとozというパッケージです.それぞれを独立に使うと,問題なく動作します.例は添付します.これを同時に使うと,おかしくなる場合があります.たとえば,次の場合.

\documentclass{report}

\usepackage{nccmath}

\usepackage{oz}

\begin{document}


\framebox[.4\textwidth][l]{</p> <p style="margin:0px;">\begin{fleqn}

\[\begin{array}{l}

ML\_in\\

\end{array}\]

\end{fleqn}

}


\end{document}


! Missing \endgroup inserted.

<inserted text>

\endgroup

l.13 }

というエラーメッセージが出ますが,\usepackage{oz}をコメントアウトするとエラーが消えます.なお,この例ではoz.styは使っていません.nccmathはここでは,fleqnという等式を左詰めで表示する環境のために使っています.


usepackageの順序を入れ替えると,次のような別のエラーメッセージが出ます.

! LaTeX Error: Command \implies already defined.

Or name \end... illegal, see p.192 of the manual.

これからも,2つのパッケージが干渉しているらしいことが分かります.


なお,上のframeboxの使用をやめると,\usepackage{oz}を残したままでエラーが出ません.


Tetsuo Tamai への返信

Re: パッケージ間の干渉

- 和田 勇 の投稿

理由はよくわかりませんが、以下のふた通りでダメでしょうか

ちなみに調べていたのは math mode と mbox の関連です。

  • \[ .... \] を使いたい場合は parbox / minipage 等で囲う

    fleqn を囲っても良いと思う

        @@ -1,15 +1,18 @@
        % testN.tex
        \documentclass{report}
        \usepackage{nccmath}
        +\usepackage{oz}

        \begin{document}
        \framebox[.5\textwidth][l]{
        \begin{fleqn}
        +  \parbox{.5\textwidth}{ % .45 くらいの方が良いかな
            \[\begin{array}{l}
                constant: d\\
                variables: a, b, c\\
            \end{array}
            \]
        +  }
        \end{fleqn}
        }
        \end{document}
  • \[ ... \] のかわりに $ ... $ を使う
        @@ -1,15 +1,17 @@
        % testN.tex
        \documentclass{report}
        \usepackage{nccmath}
        +\usepackage{oz}

        \begin{document}
        \framebox[.5\textwidth][l]{
        \begin{fleqn}
        -    \[\begin{array}{l}
        +    $
        +    \begin{array}{l}
                constant: d\\
                variables: a, b, c\\
            \end{array}
        -    \]
        +    $
        \end{fleqn}
        }
        \end{document}
和田 勇 への返信

Re: パッケージ間の干渉

- Tetsuo Tamai の投稿
和田様
ありがとうございます.ちょっと試したところ,確かにうまくいきそうです.実際に書きたい本文のもとで,やってみることにします.
和田 勇 への返信

Re: パッケージ間の干渉

- Tetsuo Tamai の投稿
本番で試してみましたが,結果はまたエラーでした.その現象を簡単なサンプルで再現するのは難しいですが,いろいろ試している過程で和田さんの修正案でも(1と2のどちらでも,あるいは両方入れた版でも),usepackageの順序を入れ替えるだけでエラーになることが分かりました.

% testN.tex as suggested by Wada

\documentclass{report}

\usepackage{oz}

\usepackage{nccmath}


\begin{document}

\framebox[.5\textwidth][l]{

\begin{fleqn}

\parbox{.45\textwidth}{

$\begin{array}{l}

constant: d\\

variables: a, b, c\\

\end{array}

$

}

\end{fleqn}

}

\end{document}


! LaTeX Error: Command \implies already defined.

Or name \end... illegal, see p.192 of the manual.

という前に出たのと同じメッセージです.

Tetsuo Tamai への返信

Re: パッケージ間の干渉

- 和田 勇 の投稿
  • 「\implies already define」と出ているようなので、利用しているスタイルファイルなどを .log ファイルから抽出して対象文字列で検索してみました  
  • implies を検索すると oz.sty は nccmath.sty で自動で取り込まれる amsmath.sty を前提としてみているように思います。
        /usr/local/texlive/2021/texmf-dist/tex/latex/objectz/oz.sty
        404:\let \implies   \imp

        /usr/local/texlive/2021/texmf-dist/tex/latex/amsmath/amsmath.sty
        401:\newcommand{\implies}{\DOTSB\;\Longrightarrow\;}
Tetsuo Tamai への返信

Re: パッケージ間の干渉

- 流橋 利樹 の投稿
途中で割り込んでしまい恐縮です。

> ! LaTeX Error: Command \implies already defined.

このエラーメッセージは以下のようにすれば解消できると思います。

\usepackage{oz}
\let\implies\relax
\usepackage{nccmath}

ただし、本質的な問題は oz.sty で定義されている \dot のようで、上記だけではうまくいきません。

門外漢のため出力結果の妥当性は判断できませんが、少なくとも最初に提示されたサンプルについては下記で回避できるようです。

%% 出典:https://tex.stackexchange.com/questions/203079/problem-of-small-brackets-in-latex
\makeatletter
\let\latex@dot\dot
\usepackage{oz}
\let\oz@implies\implies
\let\oz@mod\mod
\let\oz@dot\dot
\let\implies\relax
\let\mod\relax
\let\dot\latex@dot
\usepackage{nccmath}
\let\implies\oz@implies
\let\mod\oz@mod
\let\dot\oz@dot
\makeatother

この場合、\implies と \mod の定義は oz.sty のものが採用されるはずです。もし、nccmath.sty(amsmath.sty)の定義をお望みであれば、下記のようにすればよいのだと思います。

\makeatletter
\let\latex@dot\dot
\usepackage{oz}
\let\oz@dot\dot
\let\implies\relax
\let\mod\relax
\let\dot\latex@dot
\usepackage{nccmath}
\let\dot\oz@dot
\makeatother
流橋 利樹 への返信

Re: パッケージ間の干渉

- Tetsuo Tamai の投稿
流橋様
貴重なご示唆をありがとうございます.添付のサンプルプログラムではうまくいきますが,それを切り出した元のプログラムでは,添付ファイルの27行目に相当するところで,
! Missing $ inserted.
というエラーが出ます.Latex マクロについての知識が不十分なのでよく理解できていないところがありますが,とりあえず状況報告です.
Tetsuo Tamai への返信

Re: パッケージ間の干渉

- 流橋 利樹 の投稿
当てずっぽうで色々試してみましたが、残念ながら症状を再現させることはできませんでした。

添付していただいたファイルではエラーにならないことから、当該行《より前の行》に問題を抱えている可能性が高いと思います。

なお、oz.sty の中身を見ていただくと分かりますが、数学の世界で一般的に用いられる記号等をことごとく Object Z 向け(?)に書き換えていて(主に \def や \let で始まる行)、数式を混在させることは想定していないような雰囲気です。従って、数式を含む部分が怪しいのではないかと想像しています。
流橋 利樹 への返信

Re: パッケージ間の干渉

- Tetsuo Tamai の投稿
大変,失礼いたしました.私の方でいろいろミスが重なってこのエラーが起きたもので,教えていただいたパッケージ間の衝突回避策は有効でした.まことにありがとうございました.