
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?
\makeatletter
: O@
caractere por padrão tem algum significado especial e este comando remove temporariamente esse significado especial.\renewcommand*
: serve para redefinir uma macro existente. A variação com estrela aqui evita a inclusão acidental de vários parágrafos (\n\n
ou\par
) quando a macro é usada.\env@matrix
: Este é o comando que estamos renovando, provavelmente. Está definido em algum lugaramsmath
? Ele realmente tem um@
símbolo em seu nome?[1]
: Isso significa que o comando recém-renovado recebe um argumento opcional.[*\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 comoamsmath
10 por padrão, estamos fazendo algumas contas com ela aqui? Ou redefini-lo? Ou o que? A finalc
eu 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?{%
: 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.\hskip -\arraycolsep
: Este é um retrocesso pela quantidade de\arraycolsep
\let\@ifnextchar\new@ifnextchar
: Isso está sombreando o comando\@ifnextchar
ou algo assim, mas por quê? Nenhum\@ifnextchar
ou\new@ifnextchar
parece ser usado.\array{#1}}
: Isso insere uma matriz bruta e passa o parâmetro. Não tenho certeza se#1
aqui se refere à[ccc:c]
especificação opcional ou ao conteúdo real da matriz.\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.
\makeatletter
: Faz@
ser uma letra, portanto pode ser usada em um nome de macro. VerO que \makeatletter e \makeatother fazem?- Como você sabe.
- Leia o código-fonte documentado de
amsmath
(amsmath.pdf
produzido pela compilaçãoamsmath.dtx
). É o início de um conjunto de ambientes matriciais (matrix
,bmatrix
,pmatrix
, etc.) - Um argumento. Na verdade, não se sabe neste momento se o argumento é opcional ou não.
[...]
depois[1]
(ou[2]
,[3]
) significa O primeiro argumento é opcional e especifica o valor padrão.\c@MaxMatrixCols
é o mesmo de\value{MaxMatrixCols}
, ondeMaxMatrixCols
é um contador definido emamsmath
(padrão 10).* \c@MaxMatrixCols c
é usado como argumento de\array
, é equivalente a\begin{array}{*{10}{c}}
- Como você sabe.
- Como você sabe. O espaço extra
\arraycolsep
é produzido pelo\array
ambientearray
. Eu usaria\begin{@{}*{10}{c}@{}}
em vez disso, se eu escrevesse. \new@ifnextchar
é definido emamsgen.sty
carregado poramsmath
. Leia ocódigo fonte documentado.\array
é o começo doarray
meio ambiente. Observe que os ambientes de matrizes individuais eventualmente chamam\endarray
.- Veja acima.