Как работает этот макрос для расширенных матриц?

Как работает этот макрос для расширенных матриц?

Я использовал этот код, который где-то нашел, чтобы набрать буквально сотни расширенных матриц, и это было потрясающе:

\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, эм, на начальной стадии. Но я стараюсь учиться.

Однако у меня возникли проблемы с тем, чтобы понять, как именно работает команда redefined matrix, как указано выше. Вот моя лучшая догадка. Можете ли вы исправить меня и/или заполнить пробелы?

  1. \makeatletter: @Символ по умолчанию имеет особое значение, и эта команда временно снимает это особое значение.
  2. \renewcommand*: Это для переопределения существующего макроса. Звездный вариант здесь предотвращает случайное включение нескольких абзацев ( \n\nили \par) при использовании макроса.
  3. \env@matrix: Это команда, которую мы обновляем, предположительно. Она где-то определена в amsmath? Действительно ли @в ее названии есть символ?
  4. [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). Это начало набора матричных сред ( matrix, bmatrix, pmatrix, и т.д.)
  4. Один аргумент. На данный момент неизвестно, является ли аргумент необязательным или нет.
  5. [...]после [1](или [2], [3]) означает, что первый аргумент является необязательным и указывает значение по умолчанию.

    \c@MaxMatrixColsто же самое, что и \value{MaxMatrixCols}, где MaxMatrixCols— счетчик, определенный в amsmath(по умолчанию 10).

    * \c@MaxMatrixCols cиспользуется как аргумент \array, это эквивалентно

    \begin{array}{*{10}{c}}
    
  6. Как вы знаете.
  7. Как вы знаете. Дополнительное пространство \arraycolsepсоздается средой \arrayie array. Я бы использовал \begin{@{}*{10}{c}@{}}вместо этого, если бы я это писал.
  8. \new@ifnextcharопределяется в amsgen.styзагруженном amsmath. Прочитайтедокументированный исходный код.
  9. \arrayявляется началом arrayсреды. Обратите внимание, что отдельные матричные среды в конечном итоге вызывают \endarray.
  10. См. выше.

Связанный контент