Como funciona esta macro para matrizes aumentadas?

Como funciona esta macro para matrizes aumentadas?

Usei este código que encontrei em algum lugar para compor literalmente centenas de matrizes aumentadas e tem sido incrível:

\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}

Minhas habilidades em TeX e LaTeX são, hum, incipientes. Mas estou fazendo o meu melhor para aprender.

No entanto, estou tendo problemas para descobrir exatamente como funciona o comando de matriz redefinido acima. Aqui está meu melhor palpite. Você pode me corrigir e/ou preencher as lacunas?

  1. \makeatletter: O @caractere por padrão tem algum significado especial e este comando remove temporariamente esse significado especial.
  2. \renewcommand*: serve para redefinir uma macro existente. A variação com estrela aqui evita a inclusão acidental de vários parágrafos ( \n\nou \par) quando a macro é usada.
  3. \env@matrix: Este é o comando que estamos renovando, provavelmente. Está definido em algum lugar amsmath? Ele realmente tem um @símbolo em seu nome?
  4. [1]: Isso significa que o comando recém-renovado recebe um argumento opcional.
  5. [*\c@MaxMatrixCols c]: Não sei o que *o início disso faz. \c(afaik) é para fazer cedilhas, mas isso não parece caber aqui. MaxMatrixColsé uma variável definida como amsmath10 por padrão, estamos fazendo algumas contas com ela aqui? Ou redefini-lo? Ou o que? A final ceu também não tenho ideia. Na verdade, o que é toda essa construção? É alguma correspondência de padrão para o parâmetro opcional?
  6. {%: O uso inteligente de um comentário aqui é presumivelmente para ignorar a nova linha. No entanto, não vejo nenhuma diferença no espaçamento sem ele.
  7. \hskip -\arraycolsep: Este é um retrocesso pela quantidade de\arraycolsep
  8. \let\@ifnextchar\new@ifnextchar: Isso está sombreando o comando \@ifnextcharou algo assim, mas por quê? Nenhum \@ifnextcharou \new@ifnextcharparece ser usado.
  9. \array{#1}}: Isso insere uma matriz bruta e passa o parâmetro. Não tenho certeza se #1aqui se refere à [ccc:c]especificação opcional ou ao conteúdo real da matriz.
  10. \makeatother: isso presumivelmente retorna o @símbolo ao seu status normal.

Responder1

Se você ainda não está familiarizado com o uso do \renewcommand, talvez seja necessário aprender mais para entender o código.

  1. \makeatletter: Faz @ser uma letra, portanto pode ser usada em um nome de macro. VerO que \makeatletter e \makeatother fazem?
  2. Como você sabe.
  3. Leia o código-fonte documentado de amsmath( amsmath.pdfproduzido pela compilação amsmath.dtx). É o início de um conjunto de ambientes matriciais ( matrix, bmatrix, pmatrix, etc.)
  4. Um argumento. Na verdade, não se sabe neste momento se o argumento é opcional ou não.
  5. [...]depois [1](ou [2], [3]) significa O primeiro argumento é opcional e especifica o valor padrão.

    \c@MaxMatrixColsé o mesmo de \value{MaxMatrixCols}, onde MaxMatrixColsé um contador definido em amsmath(padrão 10).

    * \c@MaxMatrixCols cé usado como argumento de \array, é equivalente a

    \begin{array}{*{10}{c}}
    
  6. Como você sabe.
  7. Como você sabe. O espaço extra \arraycolsepé produzido pelo \arrayambiente array. Eu usaria \begin{@{}*{10}{c}@{}}em vez disso, se eu escrevesse.
  8. \new@ifnextcharé definido em amsgen.stycarregado por amsmath. Leia ocódigo fonte documentado.
  9. \arrayé o começo do arraymeio ambiente. Observe que os ambientes de matrizes individuais eventualmente chamam \endarray.
  10. Veja acima.

informação relacionada