我希望定义一个命令,\myrowvector{values={1,2,3}}
并在序言中设置间距详细信息。我已通过以下方式改编代码:用户31729效果很好,除了……我该如何处理迭代中的最后一步?我想防止插入分隔符&
(行向量)或\\
(列向量)。
为了增加值之间的间距,我借用了以下代码:卡莱特克斯创建环境的替代方案bmatrix
(名为bbmatrix
)。这通常有效,但在我的\myrowvector
命令中失败,并显示“缺少 $ 插入”消息。我不太明白代码中与{+b}
和相关的部分我希望得到关于如何使用值周围具有更大间距的矩阵的提示。
\documentclass[a4paper]{article}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{expl3}
\usepackage{xparse}
\usepackage{array}
\usepackage{tabularray}
\UseTblrLibrary{amsmath}
% https://tex.stackexchange.com/questions/570455/
% CarLaTex
\NewDocumentEnvironment{bbmatrix}{+b}{
\begin{+bmatrix}[columns={1.0em, c, colsep=2pt}]
#1
\end{+bmatrix}
}{}
% https://tex.stackexchange.com/questions/423115/
% user31729
\ExplSyntaxOn
\keys_define:nn { myrowvector }
{
values .clist_set:N = \l_myrowvector_values_clist,
}
\keys_define:nn { mycolvector }
{
values .clist_set:N = \l_mycolvector_values_clist,
}
\NewDocumentCommand\myrowvector{m}{
\keys_set:nn { myrowvector } { #1 }
\ensuremath{
\begin{bmatrix}
\clist_map_inline:Nn \l_myrowvector_values_clist {
##1 &
}
\end{bmatrix}
}
}
\NewDocumentCommand\mycolvector{m}{
\keys_set:nn { mycolvector } { #1 }
\ensuremath{
\begin{bmatrix}
\clist_map_inline:Nn \l_mycolvector_values_clist {
##1 \\
}
\end{bmatrix}
}
}
\ExplSyntaxOff
\begin{document}
A row vector:
\begin{align*}
\myrowvector{values={1,2,3}}
\end{align*}
A column vector:
\begin{align*}
\mycolvector{values={1,2,3}}
\end{align*}
A less tightly spaced row vector:
\begin{align*}
\begin{bbmatrix}
1 & 2 & 3
\end{bbmatrix}
\end{align*}
A less tightly spaced column vector:
\begin{align*}
\begin{bbmatrix}
1 \\ 2 \\ 3
\end{bbmatrix}
\end{align*}
\end{document}
编辑
我接受了 egreg 的回答,但是为了后人,我想复制 skillmon 的评论,它解决了间距问题:
而不是\clist_map_inline:Nn \l_mycolvector_values_clist { ##1 \\ }
尝试使用\clist_use:Nn \l_mycolvector_values_clist { \\ }
(或\clist_use:Nn \l_myrowvector_values_clist { & }
分别)。例如参见tex.stackexchange.com/q/678399/117050。
此外,我还发现了这个相关问题: tex.stackexchange.com/questions/270223
答案1
由于tabularray
环境不喜欢&
隐藏在宏中,因此您希望将其用作+bmatrix
命令而不是环境。
您想要的是利用,\clist_use:Nn
而不是映射。
\documentclass[a4paper]{article}
\usepackage[english]{babel}
%\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%\usepackage{expl3}
%\usepackage{xparse}
\usepackage{array}
\usepackage{tabularray}
\UseTblrLibrary{amsmath}
\ExplSyntaxOn
% adapted from
% https://tex.stackexchange.com/questions/570455/
% CarLaTex
\cs_new_protected:Nn \patrickt_bbmatrix:n
{
\begin{+bmatrix}[columns={1.0em, c, colsep=2pt}]
#1
\end{+bmatrix}
}
\cs_generate_variant:Nn \patrickt_bbmatrix:n { e }
% https://tex.stackexchange.com/questions/423115/
% user31729
\keys_define:nn { patrickt/vector }
{
values .clist_set:N = \l_patrickt_vector_values_clist,
}
\NewDocumentCommand\myrowvector{m}
{
\keys_set:nn { patrickt/vector } { #1 }
\patrickt_bbmatrix:e { \clist_use:Nn \l_patrickt_vector_values_clist { & } }
}
\NewDocumentCommand\mycolvector{m}{
\keys_set:nn { patrickt/vector } { #1 }
\patrickt_bbmatrix:e { \clist_use:Nn \l_patrickt_vector_values_clist { \\ } }
}
\ExplSyntaxOff
\begin{document}
A row vector:
\begin{equation*}
\myrowvector{values={1,2,3}}
\end{equation*}
A column vector:
\begin{equation*}
\mycolvector{values={1,2,3}}
\end{equation*}
\end{document}
无需定义两组不同的键。我还删除了\ensuremath
没有实际用途的,并将其更改align*
为equation*
(切勿将前者用于单个方程式)。
另一方面,我认为没有理由使用如下语法
\myrowvector{values={1,2,3}}
超过
\myrowvector{1,2,3}
你可以完成
\documentclass[a4paper]{article}
\usepackage[english]{babel}
\usepackage[T1]{fontenc}
\usepackage{array}
\usepackage{tabularray}
\UseTblrLibrary{amsmath}
\ExplSyntaxOn
% adapted from
% https://tex.stackexchange.com/questions/570455/
% CarLaTex
\cs_new_protected:Nn \patrickt_bbmatrix:n
{
\begin{+bmatrix}[columns={1.0em, c, colsep=2pt}]
#1
\end{+bmatrix}
}
\cs_generate_variant:Nn \patrickt_bbmatrix:n { e }
\NewDocumentCommand\myrowvector{m}
{
\patrickt_bbmatrix:e { \clist_use:nn { #1 } { & } }
}
\NewDocumentCommand\mycolvector{m}{
\patrickt_bbmatrix:e { \clist_use:nn { #1 } { \\ } }
}
\ExplSyntaxOff
\begin{document}
A row vector:
\begin{equation*}
\myrowvector{1,2,3}
\end{equation*}
A column vector:
\begin{equation*}
\mycolvector{1,2,3}
\end{equation*}
\end{document}
一种不同的“统一”方法:
\documentclass[a4paper]{article}
\usepackage[english]{babel}
\usepackage[T1]{fontenc}
\usepackage{array}
\usepackage{tabularray}
\UseTblrLibrary{amsmath}
\ExplSyntaxOn
% adapted from
% https://tex.stackexchange.com/questions/570455/
% CarLaTex
\cs_new_protected:Nn \patrickt_bbmatrix:n
{
\begin{+bmatrix}[columns={1.0em, c, colsep=2pt}]
#1
\end{+bmatrix}
}
\cs_generate_variant:Nn \patrickt_bbmatrix:n { V }
\NewDocumentCommand\mymatrix{m}
{
\__patrickt_bbmatrix_build:n { #1 }
\patrickt_bbmatrix:V \l__patrickt_bbmatrix_body_tl
}
\tl_new:N \l__patrickt_bbmatrix_body_tl
\seq_new:N \l__patrickt_bbmatrix_rows_seq
\cs_new_protected:Nn \__patrickt_bbmatrix_build:n
{
\seq_set_split:Nnn \l__patrickt_bbmatrix_rows_seq { ; } { #1 }
\tl_clear:N \l__patrickt_bbmatrix_body_tl
\seq_map_inline:Nn \l__patrickt_bbmatrix_rows_seq
{
\tl_put_right:Nx \l__patrickt_bbmatrix_body_tl { \clist_use:nn { ##1 } { & } \exp_not:N \\ }
}
}
\ExplSyntaxOff
\begin{document}
\begin{equation*}
\mymatrix{1,2,3}\ne
\mymatrix{1;2;3}\ne
\mymatrix{1,2;3,4;5,6}
\end{equation*}
\end{document}