
Estou dando o próximo passo no meu aprendizado de LaTeX e começando a explorar a possibilidade de criar ambientes customizados; entretanto, os recursos que consultei não mencionam como criar um ambiente como o bmatrix
ambiente que não possui um número predefinido de argumentos.
Em particular, gostaria de definir uma variante bmatrix
(e semelhante) que me permita colorir as linhas/colunas.
Idealmente, gostaria de descobrir uma maneira de definir o ambiente para poder:
- especifique a cor de cada linha/coluna na abertura do ambiente (ou no primeiro elemento da linha/coluna). Por exemplo
\ca
, se\cb
e\cc
são macros para cores diferentes, então algo como\begin{cbmatrix}{\ca \ca \cb}
iniciaria umbmatrix
ambiente onde as entradas da primeira linha seriam agrupadas\ca
, da mesma forma para a segunda linha, e as entradas da terceira linha seriam agrupadascb
,
ou seja, a saída desejada seria equivalente a:
\begin{bmatrix}
\ca{e1} & \ca{e2} & \ca{e3} & \ca{e4} \\
\ca{e5} & \ca{e6} & \ca{e7} & \ca{e8} \\
\cb{e9}& \cb{e10} & \cb{e11} & \cb{e12} \\
e13 & e14 & e15 & e16
\end{bmatrix}
- alternar facilmente entre aplicar o comando color a linhas ou colunas (talvez com uma versão estrelada do ambiente)?
Sei que este é um resultado final muito específico, mas geralmente estou curioso para saber por onde começar para poder definir este tipo de ambiente, onde o número de entradas/argumentos não é predefinido?
Responder1
Mistura muito frágil de array
, collcell
e algumas macros internas.
\documentclass{article}
\usepackage{amsmath}
\usepackage{array}
\usepackage{collcell}
\usepackage{xcolor}
\newcommand\ca{\textcolor{red}}
\newcommand\cb{\textcolor{green}}
\newcommand\cc{\textcolor{blue}}
\newcounter{row}
\newcounter{col}
\makeatletter
\newenvironment{triplecolorbmatrix}[1]
{\setcounter{row}{1}%
\@for\name:=#1\do{%
\expandafter\def\csname rowcolor\number\value{row}\expandafter\endcsname\expandafter{\name}%
\stepcounter{row}%
}%
\setcounter{row}{0}%
\setcounter{col}{0}%
\newcommand\colorrow{\csname rowcolor\number\value{row}\endcsname}%
\let\@arraycrnormal\@arraycr
\def\@arraycr{\setcounter{col}{0}\@arraycrnormal}%
\left[\hspace{-\tabcolsep}\array{*{10}{>{\ifnum\value{col}=0\stepcounter{row}\fi\stepcounter{col}\collectcell\colorrow}c<{\endcollectcell}}}}
{\endmatrix\right]}
\makeatother
\begin{document}
\begin{equation*}
\begin{triplecolorbmatrix}{\ca,\cb,\cc}
e1 & e2 & e3 & e4 \\
e5 & e6 & e7 & e8 \\
e9 & e10 & e11 & e12 \\
e13 & e14 & e15 & e16 \\
\end{triplecolorbmatrix}
\end{equation*}
\end{document}