我正在学习 LaTeX 的下一步,并开始探索创建自定义环境的可能性;但是,我查阅过的资源并没有提到如何创建一个bmatrix
没有预定义参数数量的环境。
具体来说,我想定义一个变体bmatrix
(和类似的),允许我为行/列着色。
理想情况下,我想找到一种方法来定义环境,以便我可以:
- 在环境的开头(或行/列的第一个元素)指定每行/列的颜色。例如,如果
\ca
和\cb
是\cc
不同颜色的宏,则类似的东西\begin{cbmatrix}{\ca \ca \cb}
将启动一个bmatrix
环境,其中第一行中的条目将分别被包装在 中\ca
,第二行也是如此,第三行的条目将被包装在 中cb
,
即期望的输出相当于:
\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}
- 是否可以轻松地在将颜色命令应用于行或列之间切换(也许使用带星号的环境版本)?
我意识到这是一个非常具体的最终结果,但我通常很好奇,想知道从哪里开始能够定义这种类型的环境,其中输入/参数的数量是没有预先定义的?
答案1
array
、collcell
和一些内部宏的非常脆弱的混合。
\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}