LaTeXで定理や命題などのスペシャルな環境を作る.パート4

いままでLaTeXのパッケージを作ることで定義や定理の枠を中心に開発を進めてきました.具体的に何をするパッケージなのかは以下のパート1の「はじめに」を見てください.


スタイルファイル本体

こちらが新しくしたstetementspパッケージです.コマンドの競合にお気を付けください.

ちなみにこれの使い方ですが2つありますので簡単に説明します.1つ目は作業しているtex文書のプリアンブルに\usepackage{statementsp3}と打って上のファイルをtex文書と同じディレクトリに保存する.2つ目はパソコンの
C:\texlive\texmf-local\tex\latex
の位置に上のファイルを保存してコマンドプロンプトに「mktexlsr」と入力してあげると今後どのtex文書をどの場所で実行しても内部に\usepackage{statementsp3}と入力すれば認識してくれます.(これはwindowsの場合.)

追加機能とその説明

これに加えてさらに次の機能を追加しました.

  1. 自分で枠の種類を簡単に定義できる機能.

  2. 相互参照のときに定理のタイトル名ごと参照する相互参照コマンドの追加.

1.自分で枠の種類を簡単に定義できる機能.

例えば以下のようにプリアンブル(どこでもいいですがプリアンブル推奨)に記述すると

%\newstatementsp{(ステートメント種)}{(ステートメントの表示名)}{(タイトル文字色)}{(タイトル背景色)}
\newstatementsp{def}{定義}{000000}{FFCCCC}

次のような枠を作るための準備が整います.色の部分はHTML形式で指定してください.このとき#000000のように#はいりません.

これを実際に出現させるには以下のように打ちます.(上の画像はテキトーな位置にある枠をスクショしたので番号が1.5になってますがちゃんと1.1から始まります.)

\begin{statementsp}<def>[labelofdef](定義のタイトル)
    これは定義です.
\end{statementsp}

この辺は過去の記事で説明しているのでそちらを参照ください.

2.相互参照のときに定理のタイトル名ごと参照する相互参照コマンドの追加.

今までは

\refsp{def:labelofdef}

とすることで「定義 1.5」のようにハイパーリンク付き相互参照が出力されました.今回はこれに加えて

\refnamesp{def:labelofdef}

と打つことで「定義 1.5 (定義のタイトル)」と,ここまで含めて出力されます.もちろんハイパーリンクは後ろの括弧まで付きます.

注意とバグ

newstatementspコマンドで新しく枠を定義するときやその他存在するバグを述べておきます.

ステートメント種などには特殊文字を含めないように.

例えばdefではなくてmy:defのようにする,つまり

\newstatementsp{my:def}{定義}{色}{色}

のようにするとバグります.「:」を使ってはいけません.これは相互参照にprettyrefというパッケージを用いていて「:」の前についている文字列を認識させて相互参照の出力形式を変更しているからです.
他にも「%」とか「\」などの特殊文字はやめた方がいいです.思わぬバグの原因となるでしょう.

環境内でverbatim環境は使えない.

これはどちらかというとverbatim環境が悪さしている気がしますが以下のようにするとエラーを吐かれます.

\begin{statementsp}<def>[label](definition)
  \begin{verbatim}
     verbatim環境の中身
  \end{verbatim}
\end{statementsp}

verbatimとは環境内に存在する文字列をそのまま(コマンドなども展開せずにマジでガチのそのまま)出力させる環境です.
もしかしたら他にもネストしてはいけない環境があるかもしれません.しかし実用的なものはすべて入れられます.(alignとかitemizeとかtcolorboxとか.)

長すぎるタイトルははみ出る.(修正済み)

次のように長すぎるタイトル名ははみ出ます.これはtcolorboxのデザイン上の問題なので少しデザインを変えれば改行してくれます.

追記:これは簡単に直すことができます.スタイルファイルの初めに

\usepackage{varwidth}

を打ってvarwidthパッケージを呼び出しておきます.その後途中の\tcbsetコマンドがあると思うのですが

%Foundamental design of tcolorbox.
\tcbset{
    statement/.style 2 args={
            enhanced,
            coltitle=#1,
            colframe=#2,
            boxrule=2pt,
            colback=white,
            breakable,
            sharp corners,
            attach boxed title to top left={xshift=3mm, yshift*=-\tcboxedtitleheight/2},
            boxed title style={
                    colframe=#2,
                    boxrule=2pt,
                    colback=#2,
                    sharp corners
                },
            after upper=\hfill $\square$
        }
}

こうなってると思います.enhancedの下に以下のようにvarwidth boxed titleというオプションを追加しましょう.

%Foundamental design of tcolorbox.
\tcbset{
    statement/.style 2 args={
            enhanced,
            varwidth boxed title,
            coltitle=#1,
            colframe=#2,
            boxrule=2pt,
            colback=white,
            breakable,
            sharp corners,
            attach boxed title to top left={xshift=3mm, yshift*=-\tcboxedtitleheight/2},
            boxed title style={
                    colframe=#2,
                    boxrule=2pt,
                    colback=#2,
                    sharp corners
                },
            after upper=\hfill $\square$
        }
}

あとはスタイルファイルを保存して忘れずにターミナルでmktexlsrを実行するなりして更新してコンパイルするとよいでしょう.

tcolorboxの中の大きすぎるtcolorboxはページまたぎしない

これまたtcolorboxの現行の仕様ですがtcolorboxの中に巨大なtcolorboxを入れるとうまくページまたぎせずにバグることがあります.

いいなと思ったら応援しよう!