格式化对应矩阵行之间的箭头

格式化对应矩阵行之间的箭头

我正在创建的一些材料需要如下所示的输出:(
替代文本 注意箭头的位置)。

我正在使用以下代码(带有 AMS 宏)来生成它,并且我正在寻找注释 - 它运行良好,但我很好奇是否有更好/更干净的方法来处理箭头:

\[
  \begin{bmatrix}[rrr|r] 1 & 2 & 0 & -1 \\ 2 & 1 & 1 & 1 \\ -1 & 1 & -1 & -1   \end{bmatrix}
  \begin{matrix}[c] ~ \\ \xrightarrow{R_2-2R_1} \\ \xrightarrow{R_3+R_1} \end{matrix}
  \begin{bmatrix}[rrr|r] 1 & 2 & 0 & -1 \\ 0 & -3 & 1 & 3 \\ 0 & 3 & -1 & -2 \end{bmatrix}
  \begin{matrix}[c] ~ \\ ~ \\ \xrightarrow{R_2+R_3} \end{matrix}
  \begin{bmatrix}[rrr|r] 1 & 2 & 0 & -1 \\ 0 & -3 & 1 & 3 \\ 0 & 0 & 0 & 1 \end{bmatrix}
\]

我只使用标准 AMS 宏,以及我在网上找到的矩阵宏的一个可爱补充,它允许在 AMS 矩阵内指定列:

\makeatletter
\renewcommand*\env@matrix[1][*\c@MaxMatrixCols c]{%
  \hskip -\arraycolsep
  \let\@ifnextchar\new@ifnextchar
  \array{#1}}
\makeatother

答案1

除了将箭头变成简单的宏以使其更易于输入之外,我无法提供任何其他建议。例如

\newcommand\arrows[3]{
        \begin{matrix}[c]
        \ifx\relax#1\relax\else \xrightarrow{#1}\fi\\
        \ifx\relax#2\relax\else \xrightarrow{#2}\fi\\
        \ifx\relax#3\relax\else \xrightarrow{#3}\fi
        \end{matrix}
}

你可以这样使用它\arrows{}{R_2-2R_1}{R_3+R_1}

也许最好明确地传递行数,就像这样。

\newcount\arrowcount
\newcommand\arrows[1]{
        \global\arrowcount#1
        \ifnum\arrowcount>0
                \begin{matrix}[c]
                \expandafter\nextarrow
        \fi
}

\newcommand\nextarrow[1]{
        \global\advance\arrowcount-1
        \ifx\relax#1\relax\else \xrightarrow{#1}\fi
        \ifnum\arrowcount=0
                \end{matrix}
        \else
                \\
                \expandafter\nextarrow
        \fi
}

你可以像 一样使用它\arrows3{}{}{R_2+R_3}。它似乎适用于你的例子。

答案2

实现此目的的一种方法是使用在线线性代数教科书(两种意义上都是免费的)线性代数作者为 Jim Hefferon。本书以 LaTeX 编写,是开源的,因此可以下载本书及其附带的样式文件。其中一个名为 的文档linalgjh.sty是关于排版常见的线性代数内容,例如增强矩阵和行约简等。行约简的代码为:

%--------grstep
% For denoting a Gauss' reduction step.
% Use as: \grstep{\rho_1+\rho_3} or \grstep[2\rho_5 \\ 3\rho_6]{\rho_1+\rho_3}
\newcommand{\grstep}[2][\relax]{%
   \ensuremath{\mathrel{
       {\mathop{\longrightarrow}\limits^{#2\mathstrut}_{
                                     \begin{subarray}{l} #1 \end{subarray}}}}}}
\newcommand{\swap}{\leftrightarrow}

用途如下:

\documentclass{article}
\usepackage{amsmath}
\usepackage{linalgjh}
\thispagestyle{empty}
\begin{document}

    \[
    \begin{bmatrix}
    -1&2&-1&-2\\%
    2&-3&4&1\\%
    2&3&1&-2
    \end{bmatrix}
    %
    \grstep[R_3 + 2 R_1]{R_2 + 2 R_1}
    %
    \begin{bmatrix}
    -1&2&-1&-2\\%
    0&1&2&-3\\%
    0&7&-1&-6
    \end{bmatrix}
    \]
\end{document}

得出的结果为:

grstep 示例

我承认,这与问题中的不太一样,因此对于原始提问者来说,这可能不是一个好的答案。然而,有人别的看这个问题的人可能不太在意箭头是否在行上对齐,所以这可能就足够了。此外,这个linalgjh包值得多次提及,它被开发用来制作教科书。

该样式文件还有其他几个有用的线性代数宏可能会有用(我之前在回答这个问题)。

答案3

这是一个解决方案,{NiceArray}nicematrix优点是即使在行高不同的情况下也能正常工作。只有一个大数组,分隔符直接放在环境的前导中{NiceArray}

\documentclass{article}
\usepackage{nicematrix}

\begin{document}

\[\begin{NiceArray}{[ccc|c]c[ccc|c]c[ccc|c]}
1 & 2 & 0  & -1 &                        & 1 & 2  & 0  & -1 &                       & 1 & 2  & 0 & -1 \\ 
2 & 1 & 1  & 1  & \xrightarrow{R_2-2R_1} & 0 & -3 & 1  & 3  &                       & 0 & -3 & 1 & 3 \\
{ \displaystyle \int_a^b f(x) \, d x }
  & 1 & -1 & -1 & \xrightarrow{R_3+R_1}  & 0 & 3  & -1 & -2 & \xrightarrow{R_2+R_3} & 0 & 0  & 0 & 1 \\
\end{NiceArray}\]

\end{document}

上述代码的输出

答案4

这里有一个不同的对您的问题的笨拙解决方案 --- 但它比我之前使用 XyPics 提出的解决方案要好。

基本原理是一样的:将所有矩阵放入一个超级矩阵中。然后使用水平间距将矩阵分隔符引入中间你的超级矩阵,“逻辑”矩阵开始和结束的位置如下:

\newcommand\map[1]{\xrightarrow{#1}} % 为简洁起见
\[
   \左.\左.\左.\左.\左[
    \begin{数组}{rrr|rcrrr|rcrrr|r}
      1 & 2 & 0 & -1 & & 1 & 2 & 0 & -1 & & 1 & 2 & 0 & -1 \\
      2 & 1 & 1 & 1 & \map{R_2-2R_1} & 0 & 3 & -1 & 3 & & 0 & 3 & -1 & 3 \\
      -1 & 1 & -1 & -1 & \map{R_3+R_1} & 0 & 3 & -1 & -2 & \map{R_2+R_3} & 0 & 0 & 0 & -1
    \end{数组}\right]
    \mspace{-448mu}\right]
    \mspace{70mu}\right[
    \mspace{125mu}\right]
    \mspace{60mu}\right[
\]

第一个\right]是矩阵的最后一个方括号;我们首先这样做是为了确保至少这个分隔符处于 Knuth 标准位置。所有其他分隔符的位置都是通过手动选择它应该与最后一个分隔符向前或向后移动多少来定位的。

(这显然只有当矩阵变换是数学环境中唯一的或最后一个对象时才有效;否则,您应该按顺序生成矩阵分隔符,以最后一个结束,以便后续数学运算能够在等式中的正确位置进行。)

我不喜欢这个解决方案,因为它需要手动选择间距 — 除此之外,每次修改矩阵时你都必须修改间距。但至少如果你逐步更改矩阵,间距也只需要逐步更改;而且这个解决方案在其他方面都很可靠且灵活。

理想情况下,可以使用某种机制来精确确定如何正确定位分隔符;但我没有足够的 TeXpertise 来了解如何操作。有人可以帮忙吗?

相关内容