假设我有一个如下所示的 mxn 矩阵
\documentclass{article}
\usepackage{amsmath}
\newcommand*{\vth}{\vartheta}
\newcommand*{\vph}{\varphi}
\newcommand*{\pt}[1]{\left(#1\right)}
\begin{document}
\begin{equation}
\begin{bmatrix}\vph_{11}&\vph_{12}&\vph_{13}&\vph_{14}&\vph_{15}&\vph_{16}&\dot{x}\pt{T}\\
\vph_{21}&\vph_{22}&\vph_{23}&\vph_{24}&\vph_{25}&\vph_{26}&\dot{y}\pt{T}\\
\vph_{31}&\vph_{32}&\vph_{33}&\vph_{34}&\vph_{35}&\vph_{36}&\dot{z}\pt{T}\\
\vph_{41}&\vph_{42}&\vph_{43}&\vph_{44}&\vph_{45}&\vph_{46}&\ddot{x}\pt{T}\\
\vph_{51}&\vph_{52}&\vph_{53}&\vph_{54}&\vph_{55}&\vph_{56}&\ddot{y}\pt{T}\\
\vph_{61}&\vph_{62}&\vph_{63}&\vph_{64}&\vph_{65}&\vph_{66}&\ddot{z}\pt{T}\end{bmatrix}
\end{equation}
\end{document}
我如何使用宏来构建这样的矩阵,以便例如说我只想要行 1、3、5 和列 1、3、5?
我正在考虑类似 \automatrix{\vph}{1;3;5}{1;3;5} 的东西,其中第一个输入是公共变量 \vph,第二个输入是我想要包含的行(因此是第一个 pedices),第三个输入是列(第二个 pedices)。
如果可以像图中一样在“自动”矩阵中也包含一个附加列,那就太好了!
谢谢你!
答案1
您可以使用该tabularray
包:
\documentclass{article}
\usepackage{amsmath}
\newcommand*{\vth}{\vartheta}
\newcommand*{\vph}{\varphi}
\newcommand*{\pt}[1]{\left(#1\right)}
\usepackage{tabularray}
\UseTblrLibrary{counter,amsmath}
\begin{document}
\begin{equation}
\begin{+bmatrix}[cell{1-Z}{1-Y}={cmd={\vph_{\arabic{rownum}\arabic{colnum}}}}]
&&&&&&\dot{x}\pt{T}\\
&&&&&&\dot{x}\pt{T}\\
&&&&&&\dot{x}\pt{T}\\
&&&&&&\dot{x}\pt{T}\\
&&&&&&\dot{x}\pt{T}\\
&&&&&&\dot{x}\pt{T}\\
\end{+bmatrix}
\end{equation}
\end{document}
答案2
我只想要第 1、3、5 行和第 1、3、5 列
至少可以用三种方式来解释这一点。
- 第 1、3、5 行和第 1、3、5 列的所有条目都折叠成一个填充矩阵。
- 行 1,3,5 和列 1,3,5 中的所有条目均保留原始矩阵中的原样。
- 行 1,3,5 或列 1,3,5 中的所有条目都保留在原始矩阵中。
我将为每种解释提供一些代码。在每种情况下,代码在效率方面可能都不是最优的,但对于个人使用来说应该足够了。很多灵感都来自 egreg 的回答这里。
下面的每个命令都有以下键。希望它们是不言自明的。
symbol=<symbol>
, 最初\varphi
rows=<integer>
cols=<integer>
row-spec=<comma list of integers>
col-spec=<comma list of integers>
final-col=<comma list of entries>
方法 1
这里你可以提供rows
或但不能同时提供两者。和 也row-spec
类似。cols
col-spec
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand { \automatrix } { m }
{
\group_begin:
\keys_set:nn { mascolo/automatrix } { #1 }
\mascolo_automatrix:
\group_end:
}
\tl_new:N \l__mascolo_automatrix_tl
\keys_define:nn { mascolo/automatrix }
{
symbol .tl_set:N = \l__mascolo_automatrix_symbol_tl,
symbol .initial:n = \varphi,
rows .int_set:N = \l__mascolo_automatrix_totrows_int,
cols .int_set:N = \l__mascolo_automatrix_totcols_int,
row-spec .clist_set:N = \l__mascolo_automatrix_rowspec_clist,
col-spec .clist_set:N = \l__mascolo_automatrix_colspec_clist,
final-col .clist_set:N = \l__mascolo_automatrix_finalcol_clist,
}
\cs_new_protected:Nn \mascolo_automatrix:
{
\int_compare:nT
{
\int_max:nn { \l__mascolo_automatrix_totrows_int }
{ \l__mascolo_automatrix_totcols_int } > \value{MaxMatrixCols}
}
{
\setcounter{MaxMatrixCols}
{
\int_max:nn { \l__mascolo_automatrix_totrows_int }
{ \l__mascolo_automatrix_totcols_int }
}
}
\clist_if_empty:NTF \l__mascolo_automatrix_rowspec_clist
{
\int_step_function:nN { \l__mascolo_automatrix_totrows_int }
\__mascolo_automatrix_row:n
}
{
\int_step_inline:nn
{ \fp_eval:n { max( \l__mascolo_automatrix_rowspec_clist ) } }
{
\clist_if_in:NnTF \l__mascolo_automatrix_rowspec_clist { ##1 }
{ \__mascolo_automatrix_row:n { ##1 } }
{ \clist_pop:NN \l__mascolo_automatrix_finalcol_clist \l_tmpa_tl }
}
}
\begin{bmatrix}
\l__mascolo_automatrix_tl
\end{bmatrix}
}
\cs_new_protected:Nn \__mascolo_automatrix_row:n
{
\clist_if_empty:NTF \l__mascolo_automatrix_colspec_clist
{ \__mascolo_automatrix_row_nocolspec:n { #1 } }
{ \__mascolo_automatrix_row_withcolspec:n { #1 } }
}
\cs_new_protected:Nn \__mascolo_automatrix_row_nocolspec:n
{
\tl_put_right:Nn \l__mascolo_automatrix_tl
{ \l__mascolo_automatrix_symbol_tl \sb{ #1,1 } }
\int_step_inline:nnn { 2 } { \l__mascolo_automatrix_totcols_int }
{
\tl_put_right:Nn \l__mascolo_automatrix_tl
{
&
\l__mascolo_automatrix_symbol_tl \sb{ #1,##1 }
}
}
\clist_pop:NNTF \l__mascolo_automatrix_finalcol_clist \l_tmpa_tl
{
\tl_put_right:Nn \l__mascolo_automatrix_tl { & }
\tl_put_right:NV \l__mascolo_automatrix_tl \l_tmpa_tl
}
{ }
\tl_put_right:Nn \l__mascolo_automatrix_tl { \\ }
}
\cs_new_protected:Nn \__mascolo_automatrix_row_withcolspec:n
{
\tl_put_right:Nn \l__mascolo_automatrix_tl
{
\l__mascolo_automatrix_symbol_tl
\sb{ #1,\clist_item:Nn \l__mascolo_automatrix_colspec_clist{1} }
}
\int_step_inline:nnn { 2 } { \clist_count:N \l__mascolo_automatrix_colspec_clist }
{
\tl_put_right:Nn \l__mascolo_automatrix_tl
{
&
\l__mascolo_automatrix_symbol_tl
\sb{ #1,\clist_item:Nn \l__mascolo_automatrix_colspec_clist { ##1 } }
}
}
\clist_pop:NNTF \l__mascolo_automatrix_finalcol_clist \l_tmpa_tl
{
\tl_put_right:Nn \l__mascolo_automatrix_tl { & }
\tl_put_right:NV \l__mascolo_automatrix_tl \l_tmpa_tl
}
{ }
\tl_put_right:Nn \l__mascolo_automatrix_tl { \\ }
}
\ExplSyntaxOff
\begin{document}
\[
\automatrix{rows=4,cols=5,symbol=\xi,final-col={w,x,y,z}}
\quad
\automatrix{cols=5,row-spec={2,4},final-col={w,x,y,z}}
\]
\[
\automatrix{rows=4,col-spec={2,4}}
\quad
\automatrix{row-spec={2,4},col-spec={2,4}}
\]
\end{document}
方法 2
这里需要键rows
和,cols
因为我们需要提前知道原始矩阵有多大。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand { \automatrixalt } { m }
{
\group_begin:
\keys_set:nn { mascolo/automatrixalt } { #1 }
\mascolo_automatrixalt:
\group_end:
}
\tl_new:N \l__mascolo_automatrixalt_tl
\keys_define:nn { mascolo/automatrixalt }
{
symbol .tl_set:N = \l__mascolo_automatrixalt_symbol_tl,
symbol .initial:n = \varphi,
rows .int_set:N = \l__mascolo_automatrixalt_totrows_int,
rows .value_required:n = true,
cols .int_set:N = \l__mascolo_automatrixalt_totcols_int,
cols .value_required:n = true,
row-spec .clist_set:N = \l__mascolo_automatrixalt_rowspec_clist,
col-spec .clist_set:N = \l__mascolo_automatrixalt_colspec_clist,
final-col .clist_set:N = \l__mascolo_automatrixalt_finalcol_clist,
}
\cs_new_protected:Nn \mascolo_automatrixalt:
{
\int_compare:nT
{
\int_max:nn { \l__mascolo_automatrixalt_totrows_int }
{ \l__mascolo_automatrixalt_totcols_int } > \value{MaxMatrixCols}
}
{
\setcounter{MaxMatrixCols}
{
\int_max:nn { \l__mascolo_automatrixalt_totrows_int }
{ \l__mascolo_automatrixalt_totcols_int }
}
}
\clist_if_empty:NTF \l__mascolo_automatrixalt_rowspec_clist
{
\int_step_function:nN { \l__mascolo_automatrixalt_totrows_int }
\__mascolo_automatrixalt_row:n
}
{
\int_step_inline:nn
{ \l__mascolo_automatrixalt_totrows_int }
{
\clist_if_in:NnTF \l__mascolo_automatrixalt_rowspec_clist { ##1 }
{ \__mascolo_automatrixalt_row:n { ##1 } }
{
\clist_pop:NN \l__mascolo_automatrixalt_finalcol_clist \l_tmpa_tl
\tl_put_right:Nn \l__mascolo_automatrixalt_tl { \\ }
}
}
}
\begin{bmatrix}
\l__mascolo_automatrixalt_tl
\end{bmatrix}
}
\cs_new_protected:Nn \__mascolo_automatrixalt_row:n
{
\clist_if_empty:NTF \l__mascolo_automatrixalt_colspec_clist
{ \__mascolo_automatrixalt_row_nocolspec:n { #1 } }
{ \__mascolo_automatrixalt_row_withcolspec:n { #1 } }
}
\cs_new_protected:Nn \__mascolo_automatrixalt_row_nocolspec:n
{
\tl_put_right:Nn \l__mascolo_automatrixalt_tl
{ \l__mascolo_automatrixalt_symbol_tl \sb{ #1,1 } }
\int_step_inline:nnn { 2 } { \l__mascolo_automatrixalt_totcols_int }
{
\tl_put_right:Nn \l__mascolo_automatrixalt_tl
{
&
\l__mascolo_automatrixalt_symbol_tl \sb{ #1,##1 }
}
}
\clist_pop:NNTF \l__mascolo_automatrixalt_finalcol_clist \l_tmpa_tl
{
\tl_put_right:Nn \l__mascolo_automatrixalt_tl { & }
\tl_put_right:NV \l__mascolo_automatrixalt_tl \l_tmpa_tl
}
{ }
\tl_put_right:Nn \l__mascolo_automatrixalt_tl { \\ }
}
\cs_new_protected:Nn \__mascolo_automatrixalt_row_withcolspec:n
{
\tl_put_right:Nn \l__mascolo_automatrixalt_tl
{
\clist_if_in:NnTF \l__mascolo_automatrixalt_colspec_clist { 1 }
{ \l__mascolo_automatrixalt_symbol_tl \sb{ #1,1 } }
{ \phantom{ \l__mascolo_automatrixalt_symbol_tl \sb{ #1,1 } } }
}
\int_compare:nNnT { \l__mascolo_automatrixalt_totcols_int } > { 1 }
{
\int_step_inline:nnn { 2 } { \l__mascolo_automatrixalt_totcols_int }
{
\tl_put_right:Nn \l__mascolo_automatrixalt_tl
{
&
\clist_if_in:NnTF \l__mascolo_automatrixalt_colspec_clist { ##1 }
{ \l__mascolo_automatrixalt_symbol_tl \sb{ #1,##1 } }
{ \phantom{ \l__mascolo_automatrixalt_symbol_tl \sb{ #1,##1 } } }
}
}
}
\clist_pop:NNTF \l__mascolo_automatrixalt_finalcol_clist \l_tmpa_tl
{
\tl_put_right:Nn \l__mascolo_automatrixalt_tl { & }
\tl_put_right:NV \l__mascolo_automatrixalt_tl \l_tmpa_tl
}
{ }
\tl_put_right:Nn \l__mascolo_automatrixalt_tl { \\ }
}
\ExplSyntaxOff
\begin{document}
\[
\automatrixalt{rows=4,cols=5,symbol=\xi,final-col={w,x,y,z}}
\quad
\automatrixalt{rows=4,cols=5,row-spec={2,4},final-col={w,x,y,z}}
\]
\[
\automatrixalt{rows=4,cols=5,col-spec={2,4}}
\quad
\automatrixalt{rows=4,cols=5,row-spec={2,4},col-spec={2,4}}
\]
\end{document}
方法 3
与方法 2 一样,这里需要键rows
和。cols
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand { \automatrixaltii } { m }
{
\group_begin:
\keys_set:nn { mascolo/automatrixaltii } { #1 }
\mascolo_automatrixaltii:
\group_end:
}
\tl_new:N \l__mascolo_automatrixaltii_tl
\keys_define:nn { mascolo/automatrixaltii }
{
symbol .tl_set:N = \l__mascolo_automatrixaltii_symbol_tl,
symbol .initial:n = \varphi,
rows .int_set:N = \l__mascolo_automatrixaltii_totrows_int,
rows .value_required:n = true,
cols .int_set:N = \l__mascolo_automatrixaltii_totcols_int,
cols .value_required:n = true,
row-spec .clist_set:N = \l__mascolo_automatrixaltii_rowspec_clist,
col-spec .clist_set:N = \l__mascolo_automatrixaltii_colspec_clist,
final-col .clist_set:N = \l__mascolo_automatrixaltii_finalcol_clist,
}
\cs_new_protected:Nn \mascolo_automatrixaltii:
{
\int_compare:nNnT
{
\int_max:nn { \l__mascolo_automatrixaltii_totrows_int }
{ \l__mascolo_automatrixaltii_totcols_int }
}
> { \value{MaxMatrixCols} }
{
\setcounter{MaxMatrixCols}
{
\int_max:nn { \l__mascolo_automatrixaltii_totrows_int }
{ \l__mascolo_automatrixaltii_totcols_int }
}
}
\clist_if_empty:NTF \l__mascolo_automatrixaltii_rowspec_clist
{
\int_step_function:nN { \l__mascolo_automatrixaltii_totrows_int }
\__mascolo_automatrixaltii_row:n
}
{
\int_step_inline:nn
{ \l__mascolo_automatrixaltii_totrows_int }
{
\clist_if_in:NnTF \l__mascolo_automatrixaltii_rowspec_clist { ##1 }
{ \__mascolo_automatrixaltii_row_nocolspec:n { ##1 } }
{ \__mascolo_automatrixaltii_row_notinrowspec:n { ##1 } }
}
}
\begin{bmatrix}
\l__mascolo_automatrixaltii_tl
\end{bmatrix}
}
\cs_new_protected:Nn \__mascolo_automatrixaltii_row:n
{
\clist_if_empty:NTF \l__mascolo_automatrixaltii_colspec_clist
{ \__mascolo_automatrixaltii_row_nocolspec:n { #1 } }
{ \__mascolo_automatrixaltii_row_notinrowspec:n { #1 } }
}
\cs_new_protected:Nn \__mascolo_automatrixaltii_row_nocolspec:n
{
\tl_put_right:Nn \l__mascolo_automatrixaltii_tl
{ \l__mascolo_automatrixaltii_symbol_tl \sb{ #1,1 } }
\int_step_inline:nnn { 2 } { \l__mascolo_automatrixaltii_totcols_int }
{
\tl_put_right:Nn \l__mascolo_automatrixaltii_tl
{
&
\l__mascolo_automatrixaltii_symbol_tl \sb{ #1,##1 }
}
}
\clist_pop:NNTF \l__mascolo_automatrixaltii_finalcol_clist \l_tmpa_tl
{
\tl_put_right:Nn \l__mascolo_automatrixaltii_tl { & }
\tl_put_right:NV \l__mascolo_automatrixaltii_tl \l_tmpa_tl
}
{ }
\tl_put_right:Nn \l__mascolo_automatrixaltii_tl { \\ }
}
\cs_new_protected:Nn \__mascolo_automatrixaltii_row_notinrowspec:n
{
\tl_put_right:Nn \l__mascolo_automatrixaltii_tl
{
\clist_if_in:NnTF \l__mascolo_automatrixaltii_colspec_clist { 1 }
{ \l__mascolo_automatrixaltii_symbol_tl \sb{ #1,1 } }
{ \phantom{ \l__mascolo_automatrixaltii_symbol_tl \sb{ #1,1 } } }
}
\int_compare:nNnT { \l__mascolo_automatrixaltii_totcols_int } > { 1 }
{
\int_step_inline:nnn { 2 } { \l__mascolo_automatrixaltii_totcols_int }
{
\tl_put_right:Nn \l__mascolo_automatrixaltii_tl
{
&
\clist_if_in:NnTF \l__mascolo_automatrixaltii_colspec_clist { ##1 }
{ \l__mascolo_automatrixaltii_symbol_tl \sb{ #1,##1 } }
{ \phantom{ \l__mascolo_automatrixaltii_symbol_tl \sb{ #1,##1 } } }
}
}
}
\tl_put_right:Nn \l__mascolo_automatrixaltii_tl { \\ }
\clist_pop:NN \l__mascolo_automatrixaltii_finalcol_clist \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
\[
\automatrixaltii{rows=4,cols=5,symbol=\xi,final-col={w,x,y,z}}
\quad
\automatrixaltii{rows=4,cols=5,row-spec={2,4},final-col={w,x,y,z}}
\]
\[
\automatrixaltii{rows=4,cols=5,col-spec={2,4}}
\quad
\automatrixaltii{rows=4,cols=5,row-spec={2,4},col-spec={2,4}}
\]
\end{document}