這個增廣矩陣宏是如何運作的?

這個增廣矩陣宏是如何運作的?

我使用了我在某處找到的這段程式碼來排版數百個增強矩陣,這真是太神奇了:

\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]:這意味著新更新的命令需要一個可選參數。
  5. [*\c@MaxMatrixCols c]: 我不知道*這個開頭的作用是什麼。\c(afaik) 用來做變音符號,但這似乎不適合這裡。是一個預設MaxMatrixCols定義為 10 的變量,我們在這裡用它做一些數學計算嗎?amsmath還是重新設定一下?或者是什麼?最後的結果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.pdfamsmath.dtxmatrixbmatrixpmatrix
  4. 一論。目前實際上尚不清楚該參數是否是可選的。
  5. [...]after [1](or [2], [3]) 表示第一個參數是可選的,並指定預設值。

    \c@MaxMatrixCols與 相同\value{MaxMatrixCols},其中MaxMatrixCols是 中定義的計數器amsmath(預設為 10)。

    * \c@MaxMatrixCols c用作 的參數\array,它相當於

    \begin{array}{*{10}{c}}
    
  6. 如你所知。
  7. 如你所知。的額外空間\arraycolsep是由\arrayiearray環境產生的。\begin{@{}*{10}{c}@{}}如果我寫的話,我會用它來代替。
  8. \new@ifnextchar定義在amsgen.sty載入者中amsmath。閱讀記錄的源代碼
  9. \array是環境的開始array。請注意,各個矩陣環境最終都會呼叫\endarray.
  10. 往上看。

相關內容