我希望生成一个矩阵乘法,其中一个矩阵由彩色块组成。类似于:
有没有办法在 Latex 中制作出这样的东西?
答案1
我用堆栈实现了这一点。不幸的是,根据框的排列,必须进行一些调整,因此必须仔细考虑每个特定的图像。 是\colblock[color]{rows}{content}
基本单位。 \belowbaseline[length]{}
用于\colblock
将框对齐到顶部。 和\belowbaseline[length]{}
可用于代码中移动/对齐框。 传递其中任何一个的倍数\baselineskip
将允许在垂直框位置上进行一些交错。
如果\colblock
s 可以是矩形(我假设是正方形),请告诉我,以便我可以纠正答案。
\documentclass{article}
\usepackage{stackengine}
\usepackage{xcolor}
\usepackage{calc}
\newlength\mytemp
\newlength\myoffset
\myoffset=.5\ht\strutbox
\newcommand\colblock[3][blue!20]{%
\setlength\mytemp{#2\baselineskip}%
\setlength\mytemp{.5\mytemp-\myoffset}%
\belowbaseline[0pt]{%
\fboxsep=-\fboxrule\fbox{\colorbox{#1}{\rule[-\mytemp]{0ex}{#2\baselineskip}%
\makebox[#2\baselineskip]{$#3$}}}%
}}
\begin{document}
\[
\parenVectorstack{b_1 b_2 . . . . . b_n} =
\left(
\raisebox{4\baselineskip+.5\myoffset}{%
\def\stackalignment{l}\stackunder[0pt]{\colblock{2}{-2}\colblock{2}{-2}}%
{\colblock{6}{-1}\colblock[red!15]{4}{1}}%
}%
\right)
\parenVectorstack{a_1 a_2 . . . . . a_n}
\]
\end{document}
答案2
一种使用tikz
但将其隐藏在标记中的解决方案:
\begin{blockmatrix}
\block[blue](0,0)text(2,2)
\end{blockmatrix}
在位置 (0,0) 处绘制一个蓝色方块,大小为 (2,2),中间为“文本”。因此支持不同的颜色和矩形。
\documentclass{article}
\usepackage{amsmath}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc}
\definecolor{block}{RGB}{0,162,232}
\newenvironment{blockmatrix}{%
\left(%
\vcenter\bgroup\hbox\bgroup
\tikzpicture[
x=1.5\baselineskip,
y=1.5\baselineskip,
]%
}{%
\endtikzpicture
\egroup
\egroup
\right)%
}
% \block[#1](#2,#3)#4(#5,#6)
% #1: fill color
% (#2,#3): lower left corner
% #4: text in the middle
% (#5,#6): size of the block
\newcommand*{\block}[1][block]{%
\blockaux{#1}%
}
\def\blockaux#1(#2,#3)#4(#5,#6){%
\draw[fill={#1}]
let \p1=(#2,#3),
\p2=(#5,#6),
\p3=(#2+#5,#3+#6),
\p4=(#2+#5/2,#3+#6/2)
in
(\p1) rectangle (\p3)
(\p4) node {$#4$}
;%
}
\begin{document}
\[
\begin{pmatrix}b_1\\b_2\\\vdots\\b_n\end{pmatrix}
=
\begin{blockmatrix}
\block(0,0)-1(3,3)
\block(3,1)1(2,2)
\block[yellow](0,3)-2(1,1)
\block[green](1,3)2(1,1)
\end{blockmatrix}
\begin{pmatrix}a_1\\a2\\\vdots\\a_n\end{pmatrix}
\]
\end{document}
答案3
与。{pNiceMatrix}
nicematrix
\documentclass{article}
\usepackage{nicematrix}
\begin{document}
$
\renewcommand{\arraystretch}{1.6}
\begin{pmatrix}
b_1 \\ b_2 \\ \vdots \\ b_n
\end{pmatrix}
=
\begin{pNiceMatrix}[margin,columns-width=auto]
\Block[fill=red!15,draw]{1-1}{-2}
& \Block[fill=green!20,draw]{1-1}{2} & & & \\
\Block[fill=blue!15,draw]{3-3}{-1}
& & & \Block[fill=blue!15,draw]{2-2}{1}
& \\
& & & & \\
& & & & \\
\end{pNiceMatrix}
\begin{pmatrix}
a_1 \\ a_2 \\ \vdots \\ a_n
\end{pmatrix}
$
\end{document}
您需要多次编译(因为nicematrix
在后台使用 PGF/Tikz 节点)。