我使用在某处找到的代码来排版数百个增强矩阵,效果非常惊人:
\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 技能还很初级。但我正在尽力学习。
但是,我无法弄清楚上述重新定义的矩阵命令究竟是如何工作的。这是我最好的猜测。你能纠正我和/或填补空白吗?
\makeatletter
:该@
字符默认具有某些特殊含义,此命令将暂时删除该特殊含义。\renewcommand*
:这用于重新定义现有宏。此处带星号的变体可防止在使用宏时意外包含多个段落(\n\n
或)。\par
\env@matrix
:大概这就是我们要更新的命令。它在某处定义吗?它的名字里amsmath
真的有一个符号吗?@
[1]
:这意味着新更新的命令采用一个可选参数。[*\c@MaxMatrixCols c]
:我不知道*
这个开头的 是做什么的。\c
(据我所知)是用来做变音符的,但似乎不适合这里。MaxMatrixCols
是一个在 中定义的变量,amsmath
默认情况下为 10,我们要在这里对它进行一些数学运算吗?还是重新设置它?还是什么? 最后一个c
我也不知道。事实上,这整个构造是什么?它是可选参数的某种模式匹配吗?{%
:此处巧妙地使用了注释,大概是为了忽略换行符。但是,如果没有注释,我看不出间距有什么不同。\hskip -\arraycolsep
:这是按以下量退格\arraycolsep
\let\@ifnextchar\new@ifnextchar
:这是隐藏命令\@ifnextchar
还是什么,但为什么呢?\@ifnextchar
似乎\new@ifnextchar
都没有使用。\array{#1}}
:这会插入一个原始数组,并传递参数。我不确定#1
这里指的是可选[ccc:c]
规范还是矩阵的实际内容。\makeatother
:这大概会使@
符号恢复其正常状态。
答案1
如果您还不熟悉的用法\renewcommand
,您可能需要学习更多知识来理解代码。
\makeatletter
: 使其@
成为字母,因此可以用作宏名。请参阅\makeatletter 和 \makeatother 起什么作用?- 如你所知。
- 阅读 的文档化源代码(通过编译 生成)
amsmath
。它是一组矩阵环境的开始(、、等)。amsmath.pdf
amsmath.dtx
matrix
bmatrix
pmatrix
- 一个参数。目前实际上还不知道该参数是否是可选的。
[...]
after[1]
(或[2]
,[3]
)表示第一个参数是可选的,并指定默认值。\c@MaxMatrixCols
与 相同\value{MaxMatrixCols}
,其中MaxMatrixCols
是 中定义的计数器amsmath
(默认为 10)。* \c@MaxMatrixCols c
用作的参数\array
,它相当于\begin{array}{*{10}{c}}
- 如你所知。
- 如您所知。的额外空间
\arraycolsep
是由\array
iearray
环境产生的。如果我写的话,我会使用\begin{@{}*{10}{c}@{}}
它来代替它。 \new@ifnextchar
定义在amsgen.sty
loaded by中amsmath
。阅读记录源代码。\array
是环境的开始array
。请注意,各个矩阵环境最终会调用\endarray
。- 往上看。