将参数列表传递给矩阵:迭代中最后一步的问题

将参数列表传递给矩阵:迭代中最后一步的问题

我希望定义一个命令,\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}

在此处输入图片描述

相关内容