拡張行列のこのマクロはどのように機能しますか?

拡張行列のこのマクロはどのように機能しますか?

どこかで見つけたこのコードを使って、文字通り何百もの拡張行列をタイプセットしてみましたが、驚くべき結果になりました。

\documentclass[a4paper,12pt]{article}
\usepackage{amsmath}
\usepackage{arydshln}
\makeatletter
  \renewcommand*\env@matrix[1][*\c@MaxMatrixCols c]{%
    \hskip -\arraycolsep
    \let\@ifnextchar\new@ifnextchar
  \array{#1}}
\makeatother

\begin{document}
\(\begin{bmatrix}[ccc:c]
  1&2&3&0 \\
  4&5&6&0 \\
  7&8&9&0 \\
\end{bmatrix}\)
\end{document}

私の TeX と LaTeX のスキルは、うーん、まだまだ未熟です。でも、一生懸命学んでいます。

しかし、上記のように再定義されたマトリックス コマンドがどのように機能するかを正確に把握するのに苦労しています。これが私の推測です。訂正したり、不足している部分を補ったりしていただけますか?

  1. \makeatletter:@文字はデフォルトで何らかの特別な意味を持ちますが、このコマンドは一時的にその特別な意味を削除します。
  2. \renewcommand*: これは既存のマクロを再定義するためのものです。ここでの星印の付いたバリエーションは、マクロの使用時に複数の段落 (\n\nまたは) が誤って含まれるのを防ぎます。\par
  3. \env@matrix: これはおそらく、更新するコマンドです。 のどこかで定義されていますか?名前にamsmath本当にシンボルが含まれていますか?@
  4. [1]: これは、新しく更新されたコマンドが 1 つのオプションの引数を取ることを意味します。
  5. [*\c@MaxMatrixCols c]*:この最初のが何をするのかわかりません。 \c(私の知る限り) はセディーユを行うためのものですが、ここには適していないようです。は でMaxMatrixCols定義されている変数でamsmath、デフォルトでは 10 ですが、ここでこれを使って計算を行っているのでしょうか? または、リセットしているのでしょうか? それとも、どうなのでしょうか? 最後cについてもわかりません。実際、この構造全体とは何でしょうか? オプションのパラメータのパターン マッチングでしょうか?
  6. {%: ここでコメントを巧みに使用しているのは、おそらく改行を無視するためでしょう。しかし、改行がなくてもスペースに違いは見当たりません。
  7. \hskip -\arraycolsep: これはバックスペースの量です\arraycolsep
  8. \let\@ifnextchar\new@ifnextchar: これはコマンドをシャドウイングしている\@ifnextcharようですが、なぜでしょうか? も も\@ifnextchar使用\new@ifnextcharされていないようです。
  9. \array{#1}}: これは生の配列を挿入し、パラメータを渡します。#1ここではオプションの[ccc:c]仕様を参照しているのか、それともマトリックスの実際の内容を参照しているのかはわかりません。
  10. \makeatother: これにより、@シンボルは通常の状態に戻ります。

答え1

の使用法にまだ慣れていない場合は\renewcommand、コードを理解するためにさらに学習する必要があるかもしれません。

  1. \makeatletter:@文字になるため、マクロ名に使用できます。\makeatletter と \makeatother は何をしますか?
  2. あなたが知っているように。
  3. amsmathのドキュメント化されたソースコードを読んでくださいamsmath.pdf( をコンパイルして生成されますamsmath.dtx)。これは、一連のマトリックス環境(matrixbmatrixpmatrixなど)の始まりです。
  4. 引数は 1 つです。引数がオプションであるかどうかは、現時点では不明です。
  5. [...]after [1](または[2][3]) は、最初の引数がオプションであり、デフォルト値を指定することを意味します。

    \c@MaxMatrixColsは と同じです\value{MaxMatrixCols}。ここで はMaxMatrixColsで定義されたカウンタですamsmath(デフォルトは 10)。

    * \c@MaxMatrixCols cの引数として使用される場合\arrayは、

    \begin{array}{*{10}{c}}
    
  6. あなたが知っているように。
  7. ご存知のとおり、 の余分なスペースはie環境\arraycolsepによって生成されます。私が書く場合は、代わりにを使用します。\arrayarray\begin{@{}*{10}{c}@{}}
  8. \new@ifnextcharamsgen.styは によってロードされで定義されていますamsmath文書化されたソースコード
  9. \arrayは環境の始まりですarray。個々の行列環境は最終的に を呼び出すことに注意してください\endarray
  10. 上記を参照。

関連情報