这个增广矩阵的宏如何工作?

这个增广矩阵的宏如何工作?

我使用在某处找到的代码来排版数百个增强矩阵,效果非常惊人:

\documentclass[a4paper,12pt]{article}
\usepackage{amsmath}
\usepackage{arydshln}
\makeatletter
  \renewcommand*\env@matrix[1][*\c@MaxMatrixCols c]{%
    \hskip -\arraycolsep
    \let\@ifnextchar\new@ifnextchar
  \array{#1}}
\makeatother

\begin{document}
\(\begin{bmatrix}[ccc:c]
  1&2&3&0 \\
  4&5&6&0 \\
  7&8&9&0 \\
\end{bmatrix}\)
\end{document}

我的 TeX 和 LaTeX 技能还很初级。但我正在尽力学习。

但是,我无法弄清楚上述重新定义的矩阵命令究竟是如何工作的。这是我最好的猜测。你能纠正我和/或填补空白吗?

  1. \makeatletter:该@字符默认具有某些特殊含义,此命令将暂时删除该特殊含义。
  2. \renewcommand*:这用于重新定义现有宏。此处带星号的变体可防止在使用宏时意外包含多个段落(\n\n或)。\par
  3. \env@matrix:大概这就是我们要更新的命令。它在某处定义吗?它的名字里amsmath真的有一个符号吗?@
  4. [1]:这意味着新更新的命令采用一个可选参数。
  5. [*\c@MaxMatrixCols c]:我不知道*这个开头的 是做什么的。\c(据我所知)是用来做变音符的,但似乎不适合这里。MaxMatrixCols是一个在 中定义的变量,amsmath默认情况下为 10,我们要在这里对它进行一些数学运算吗?还是重新设置它?还是什么? 最后一个c我也不知道。事实上,这整个构造是什么?它是可选参数的某种模式匹配吗?
  6. {%:此处巧妙地使用了注释,大概是为了忽略换行符。但是,如果没有注释,我看不出间距有什么不同。
  7. \hskip -\arraycolsep:这是按以下量退格\arraycolsep
  8. \let\@ifnextchar\new@ifnextchar:这是隐藏命令\@ifnextchar还是什么,但为什么呢?\@ifnextchar似乎\new@ifnextchar都没有使用。
  9. \array{#1}}:这会插入一个原始数组,并传递参数。我不确定#1这里指的是可选[ccc:c]规范还是矩阵的实际内容。
  10. \makeatother:这大概会使@符号恢复其正常状态。

答案1

如果您还不熟悉的用法\renewcommand,您可能需要学习更多知识来理解代码。

  1. \makeatletter: 使其@成为字母,因此可以用作宏名。请参阅\makeatletter 和 \makeatother 起什么作用?
  2. 如你所知。
  3. 阅读 的文档化源代码(通过编译 生成) amsmath。它是一组矩阵环境的开始(、、等)。amsmath.pdfamsmath.dtxmatrixbmatrixpmatrix
  4. 一个参数。目前实际上还不知道该参数是否是可选的。
  5. [...]after [1](或[2], [3])表示第一个参数是可选的,并指定默认值。

    \c@MaxMatrixCols与 相同\value{MaxMatrixCols},其中MaxMatrixCols是 中定义的计数器amsmath(默认为 10)。

    * \c@MaxMatrixCols c用作的参数\array,它相当于

    \begin{array}{*{10}{c}}
    
  6. 如你所知。
  7. 如您所知。的额外空间\arraycolsep是由\arrayiearray环境产生的。如果我写的话,我会使用\begin{@{}*{10}{c}@{}}它来代替它。
  8. \new@ifnextchar定义在amsgen.styloaded by中amsmath。阅读记录源代码
  9. \array是环境的开始array。请注意,各个矩阵环境最终会调用\endarray
  10. 往上看。

相关内容