找回密码
 快速注册
搜索
查看: 1873|回复: 12

全包围矩阵

[复制链接]

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2017-9-18 14:08 |阅读模式
问题来自:bbs.ctex.org/forum.php?mod=viewthread&tid=154094
要输入这样的矩阵:
微信截图_20170915202442.png

方法一:用 latexstudio.net/archives/643 里提供的 qbordermatrix 包。

方法二:就是我在原帖中的 tikz 画法:
  1. \documentclass{article}
  2. \usepackage{amsmath,amssymb}
  3. \usepackage{tikz}
  4. \usetikzlibrary{matrix,calc}
  5. \begin{document}
  6. \begin{tikzpicture}[baseline=(m-3-3.base),every node/.style={inner sep=0pt}]
  7. \matrix (m) [matrix of math nodes,column sep=12pt,row sep=8pt]
  8. {
  9. \square & x & y & \lambda & c_i \\
  10. f_1 & 2^* & \square & 0^\circ & 2 \\
  11. f_2 & \square & 2^\circ & 0^* & 2 \\
  12. f_2 & 0^\circ & 0^* & \square & 0 \\
  13. d_j & 2 & 2 & 0 & \square \\
  14. };
  15. \coordinate (jiao1) at (m-2-2.north west);
  16. \coordinate (jiao2) at (m-4-4.south east);
  17. \node[rectangle,left delimiter=(,right delimiter=)]
  18. at ($(jiao1)!0.5!(jiao2)$)
  19. {
  20. \tikz{\path(jiao1)(jiao2);}
  21. };
  22. \end{tikzpicture}
  23. \end{document}
复制代码
效果:
QQ截图20170917172225.png

用 tikz 画虽然麻烦些,但更自由些。

需要注意的是,括号的位置由 jiao1 和 jiao2 两个点来决定,它们实际上就是对角线的顶点。
上面的矩阵由于各元素宽度都差不多,所以取 m-2-2、m-4-4 或者 m-4-2、m-2-4 都是可以的。
而对于一般情形,还要看情况来取点。
像下面这样的情形就比较麻烦:
1 & 1 & 1 & 1 & 1 \\
2 & 2222222 & 2 & 2222222 & 2 \\
3 & 3 & 3 & 3 & 3 \\
4 & 4 & 4 & 4 & 4 \\
5 & 5 & 5 & 5 & 5 \\
最长的东西在同一行,无论取 m-2-2、m-4-4 还是 m-4-2、m-2-4 都不行,会是这样子:
QQ截图20170918143612.png     QQ截图20170918143711.png
这时得这样取:
\coordinate (jiao1) at (m-2-2.north west);
\coordinate (jiao2) at (m-4-4.south east-|m-2-4.east);
效果才是正确的:
QQ截图20170918144039.png

830

主题

4862

回帖

3万

积分

积分
36159

显示全部楼层

isee 发表于 2017-9-18 22:43
tikz  画起图来真是棒的

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2017-9-20 14:39
本来想再演示更复杂的情况,比如在前三列上面加个花括号,于是照用同样的招式,在后面加上:
\coordinate (t1) at (m-1-1.north west);
\coordinate (t2) at (m-1-3.north east);
\node[rectangle,above delimiter=\{]
at (\$(t1)!0.5!(t2)\$)
{
\tikz{\path(t1)(t2);}
};
结果却出科意料:
QQ截图20170920135350.png

为什么会向上偏移了呢?
研究了很久,通过各种测试,终于发现了问题所在,就是整个图指定了 baseline=(m-3-3.base),去掉它,就不会偏移。
这是为什么呢,因为这个 baseline 影响到了里面的 \tikz{\path(t1)(t2);},结果这个 \node 的大小除了要包含 (t1)(t2),还有 (m-3-3.base),而由于它在 (t1)(t2) 的下方,于是整个 \node 就变高了。
而1楼的没问题,正是因为 (m-3-3.base) 在 (jiao1)(jiao2) 之间,换言之,如果将1楼的两个点改成
\coordinate (jiao1) at (m-1-1.north west);
\coordinate (jiao2) at (m-2-2.south east);
同样会出问题:
QQ截图20170920142037.png

但是,指定 baseline 是有必要的,它决定了与外面的东西如何对齐,不应该去掉,所以解决办法是将 \tikz{\path(t1)(t2);} 改成 \tikz[baseline=default]{\path(t1)(t2);}。

综上所述,可以写出以下的:
  1. \[
  2. f(x)=
  3. \begin{tikzpicture}[baseline=(m-3-3.base),every node/.style={inner sep=0pt}]
  4. \matrix (m) [matrix of math nodes,column sep=12pt,row sep=8pt]
  5. {
  6. \square & x & y & \lambda & c_i \\
  7. f_1 & 2^* & \square & 0^\circ & 2 \\
  8. f_2 & \square & 2^\circ & 0^* & 2 \\
  9. f_2 & 0^\circ & 0^* & \square & 0 \\
  10. d_j & 2 & 2 & 0 & \square \\
  11. };
  12. \coordinate (jiao1) at (m-2-2.north west);
  13. \coordinate (jiao2) at (m-4-4.south east);
  14. \node[rectangle,left delimiter=(,right delimiter=)]  
  15. at ($(jiao1)!0.5!(jiao2)$)  
  16. {
  17. \tikz[baseline=default]{\path(jiao1)(jiao2);}
  18. };
  19. \coordinate (jiao3) at (m-1-1.north west);
  20. \coordinate (jiao4) at (m-2-2.south east);
  21. \node[rectangle,left delimiter={[},right delimiter={]}]  
  22. at ($(jiao3)!0.5!(jiao4)$)  
  23. {
  24. \tikz[baseline=default]{\path(jiao3)(jiao4);}
  25. };
  26. \coordinate (t1) at (m-1-1.north west);
  27. \coordinate (t2) at (m-1-3.north east);
  28. \node[rectangle,above delimiter=\{] (tt)
  29. at ($(t1)!0.5!(t2)$)
  30. {
  31. \tikz[baseline=default]{\path(t1)(t2);}
  32. };
  33. \node[above=12pt] at (tt) {$t$};
  34. \end{tikzpicture}
  35. \]
复制代码
效果:
QQ截图20170920143905.png

108

主题

2372

回帖

1万

积分

积分
13374

显示全部楼层

其妙 发表于 2017-10-3 22:37
tikz好不好学?

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2017-10-3 22:40
回复 4# 其妙

不好

108

主题

2372

回帖

1万

积分

积分
13374

显示全部楼层

其妙 发表于 2017-10-3 22:54
看你们搞得那么欢,还准备学呢,

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2020-3-9 15:19
昨天在这帖用的 fit,突然想起也可以用于本帖。
测试结果是:用 fit 完全不会出现上面说的各种问题,连代码也简化不少!

比如开头的,只需这样写:
  1. \documentclass{article}
  2. \usepackage{amsmath,amssymb}
  3. \usepackage{tikz}
  4. \usetikzlibrary{matrix,fit}
  5. \begin{document}
  6. \begin{tikzpicture}[baseline=(m-3-3.base),every node/.style={inner sep=0pt}]
  7. \matrix (m) [matrix of math nodes,column sep=12pt,row sep=8pt]
  8. {
  9. \square & x & y & \lambda & c_i \\
  10. f_1 & 2^* & \square & 0^\circ & 2 \\
  11. f_2 & \square & 2^\circ & 0^* & 2 \\
  12. f_2 & 0^\circ & 0^* & \square & 0 \\
  13. d_j & 2 & 2 & 0 & \square \\
  14. };
  15. \node[fit=(m-2-2)(m-4-4)(m-2-4)(m-4-2),
  16. left delimiter=(,right delimiter=)]{};
  17. \end{tikzpicture}
  18. \end{document}
复制代码
把四个角都 fit 起来,就完全不用管哪个长哪个短的问题,保证能完全包住。
也不用在 node 里面再来一个 \tikz 了。
(效果图没变,就不再重复截图了,下同)
3# 最后那个复杂点的,也只需这样写:
  1. \[
  2. f(x)=
  3. \begin{tikzpicture}[baseline=(m-3-3.base),every node/.style={inner sep=0pt}]
  4. \matrix (m) [matrix of math nodes,column sep=12pt,row sep=8pt]
  5. {
  6. \square & x & y & \lambda & c_i \\
  7. f_1 & 2^* & \square & 0^\circ & 2 \\
  8. f_2 & \square & 2^\circ & 0^* & 2 \\
  9. f_2 & 0^\circ & 0^* & \square & 0 \\
  10. d_j & 2 & 2 & 0 & \square \\
  11. };
  12. \node[fit=(m-2-2)(m-4-4)(m-4-2)(m-2-4),
  13. left delimiter=(,right delimiter=)]{};
  14. \node[fit=(m-1-1)(m-2-2)(m-2-1)(m-1-2),
  15. left delimiter={[},right delimiter={]}]{};
  16. \node[fit=(m-1-1)(m-1-3),label={[yshift=10pt]90:$t$},
  17. above delimiter=\{]{};
  18. \end{tikzpicture}
  19. \]
复制代码
简单太多了,也完全没有什么 baseline 的问题。

评分

参与人数 1威望 +2 收起 理由
abababa + 2 很有用!

查看全部评分

413

主题

1558

回帖

1万

积分

积分
11498

显示全部楼层

abababa 发表于 2023-4-25 18:49
kuing 发表于 2020-3-9 15:19
昨天在这帖用的 fit,突然想起也可以用于本帖。
测试结果是:用 fit 完全不会出现上面说的各种问题,连代码 ...

我用的是第一段代码的那个,想在上方加上一个“括号和m列”,右边加上一个“括号和n行”,左边还有一个“J(0,n)]^m=”。

上方的那个,按kuing版主的说明弄好了,左右那两个怎么也调不好,就是括号过不去,这个要怎么做才行?我的代码如下:
  1. \begin{tikzpicture}[baseline=(m-3-3.base),every node/.style={inner sep=0pt}]
  2. \matrix (m) [matrix of math nodes,column sep=12pt,row sep=8pt]
  3. {
  4. 0 & \cdots & 0 & 1 & 0 & \cdots & 0\\
  5. 0 & \cdots & 0 & 0 & 1 & \cdots & 0\\
  6. \vdots & ~ & \vdots & \vdots & \vdots & ~ & \vdots\\
  7. 0 & \cdots & 0 & 0 & 0 & \cdots & 1\\
  8. 0 & \cdots & 0 & 0 & 0 & \cdots & 0\\
  9. \vdots & ~ & \vdots & \vdots & \vdots & ~ & \vdots\\
  10. 0 & \cdots & 0 & 0 & 0 & \cdots & 0\\
  11. };
  12. \node[fit=(m-1-1)(m-1-7)(m-7-1)(m-7-7),left delimiter=(,right delimiter=)]{};
  13. \node[fit=(m-1-1)(m-1-3),label={[yshift=10pt]90:$m$列}, above delimiter=\{]{};
  14. \node[fit=(m-5-7)(m-7-7),label={[xshift=1.0cm,yshift=-0.9cm]:$n$行}, right delimiter=\}]{};
  15. \node[fit=(m-1-1)(m-7-1),label={[yshift=-1.5cm]:$[J(0,n)]^m=$}, left delimiter=\{]{};
  16. \end{tikzpicture}
复制代码

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2023-4-25 21:35
abababa 发表于 2023-4-25 18:49
我用的是第一段代码的那个,想在上方加上一个“括号和m列”,右边加上一个“括号和n行”,左边还有一个“ ...
  1. \[
  2. [J(0,n)]^m=
  3. \begin{tikzpicture}[baseline=(m-4-4.base),every node/.style={inner sep=0pt}]
  4. \matrix (m) [matrix of math nodes,column sep=12pt,row sep=8pt,left delimiter=(,right delimiter=)]
  5. {
  6. 0 & \cdots & 0 & 1 & 0 & \cdots & 0\\
  7. 0 & \cdots & 0 & 0 & 1 & \cdots & 0\\
  8. \vdots & ~ & \vdots & \vdots & \vdots & ~ & \vdots\\
  9. 0 & \cdots & 0 & 0 & 0 & \cdots & 1\\
  10. 0 & \cdots & 0 & 0 & 0 & \cdots & 0\\
  11. \vdots & ~ & \vdots & \vdots & \vdots & ~ & \vdots\\
  12. 0 & \cdots & 0 & 0 & 0 & \cdots & 0\\
  13. };
  14. \node[fit=(m-1-1)(m-1-3),label={[yshift=10pt]90:$m$列}, above delimiter=\{]{};
  15. \node[fit=(m-5-7)(m-7-7),label={[xshift=10pt]0:$n$行}, right delimiter=\},inner xsep=10pt]{};
  16. \end{tikzpicture}
  17. \]
复制代码

413

主题

1558

回帖

1万

积分

积分
11498

显示全部楼层

abababa 发表于 2023-4-25 21:39

原来如此,是用xsep来弄的。那这样的话,想让它离得近一点,里面那个矩阵的最好是用方括号吧,但我打方括号就出错了,这种要怎么改才行?

413

主题

1558

回帖

1万

积分

积分
11498

显示全部楼层

abababa 发表于 2023-4-25 21:45
abababa 发表于 2023-4-25 21:39
原来如此,是用xsep来弄的。那这样的话,想让它离得近一点,里面那个矩阵的最好是用方括号吧,但我打方括 ...


明白了,用大括号括起来就好了。最终是这样的:
  1. \[
  2. [J(0,n)]^m=
  3. \begin{tikzpicture}[baseline=(m-4-4.base),every node/.style={inner sep=0pt}]
  4. \matrix (m) [matrix of math nodes,column sep=12pt,row sep=8pt,left delimiter={[},right delimiter={]}]
  5. {
  6. 0 & \cdots & 0 & 1 & 0 & \cdots & 0\\
  7. 0 & \cdots & 0 & 0 & 1 & \cdots & 0\\
  8. \vdots & ~ & \vdots & \vdots & \vdots & ~ & \vdots\\
  9. 0 & \cdots & 0 & 0 & 0 & \cdots & 1\\
  10. 0 & \cdots & 0 & 0 & 0 & \cdots & 0\\
  11. \vdots & ~ & \vdots & \vdots & \vdots & ~ & \vdots\\
  12. 0 & \cdots & 0 & 0 & 0 & \cdots & 0\\
  13. };
  14. \node[fit=(m-1-1)(m-1-3),label={[yshift=10pt]90:$m$列}, above delimiter=\{]{};
  15. \node[fit=(m-5-7)(m-7-7),label={[xshift=10pt]0:$n$行}, right delimiter=\},inner xsep=5pt]{};
  16. \end{tikzpicture}
  17. \]
复制代码

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2023-4-25 23:15
abababa 发表于 2023-4-25 21:45
明白了,用大括号括起来就好了。最终是这样的:

试了一下,中括号的长度似乎总是差一点点,可以考虑给 \matrix (m) [...] 里面补一个 inner sep=2pt ,相应的 inner xsep 也增加 2pt

413

主题

1558

回帖

1万

积分

积分
11498

显示全部楼层

abababa 发表于 2023-4-26 09:48
kuing 发表于 2023-4-25 23:15
试了一下,中括号的长度似乎总是差一点点,可以考虑给 \matrix (m) [...] 里面补一个 inner sep=2pt ,相 ...

是的,这样就全框起来了。非常有用。

手机版|悠闲数学娱乐论坛(第3版)

GMT+8, 2025-3-4 12:27

Powered by Discuz!

× 快速回复 返回顶部 返回列表