
Я делаю следующий шаг в изучении 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}