在多个环境中使用时,宏会产生令人讨厌的全局影响

在多个环境中使用时,宏会产生令人讨厌的全局影响

我正在使用一个很酷的宏在特定的数学环境中编写一些不错的矩阵,来自这个问题:

需要修复的丑陋矩阵

但后来我想使用相同的宏来修复一些与上一个问题(在同一文档的另一章中)无关的其他矩阵。我刚刚注意到,即使矩阵不在同一环境中,宏也会为所有矩阵提供相同的列间距。宏似乎具有全局效果,这当然不是我想要的。

如何才能使该宏仅在给定环境中本地工作,而不对其他环境产生任何影响?

下面是显示该问题的 MWE:

\documentclass[11pt,letterpaper,twoside]{book}
\usepackage{lmodern}
\usepackage[total={6in,10in},left=1.5in,top=0.5in,includehead,includefoot]{geometry}
\usepackage{microtype}
\usepackage{amsfonts}
\usepackage{mathtools}

\usepackage{eqparbox}
\newcommand{\squash}[2][M]{\eqmakebox[#1]{$#2$}}

\begin{document}

These matrices are affected by the last matrices, which is bad:
\begin{align}
    A &=
    \begin{bmatrix}
        0 & \squash{\sigma_2} \\[1em]
        \squash{\sigma_2}& 0
    \end{bmatrix},
    \\
    B &=
    \begin{bmatrix}
        \squash{-i \sigma_3} & 0 \\[1em]
        0 & \squash{-i \sigma_3}
    \end{bmatrix},
\end{align}
These matrices are affecting the first matrices which is bad:
\begin{align}
    C &=
    \begin{bmatrix}
        0 & \squash{1} \\[1em]
        \squash{r \sin \vartheta \cos \varphi} & 0
    \end{bmatrix},
    \\
    D &=
    \begin{bmatrix}
        \squash{-\, r^2} & 0 \\[1em]
        0 & \squash{-\, r^2}
    \end{bmatrix},
\end{align}

\end{document}

预览以红色显示的问题:

在此处输入图片描述

答案1

的定义\squash是错误的,因为它没有明确表明可选参数实际上是强制的。

语法\eqmakebox

\eqmakebox[<tag>][<alignment>]{<material>}

其中<tag>是任意标签,它应该是所有需要具有相同宽度的构造所共有的。

由于您在不同的上下文中使用\squash,但从未使用可选参数,因此整个文档中所有此类框的宽度都相同。

\documentclass[11pt,letterpaper,twoside]{book}
\usepackage{lmodern}
\usepackage[total={6in,10in},left=1.5in,top=0.5in,includehead,includefoot]{geometry}
\usepackage{microtype}
\usepackage{amsfonts}
\usepackage{mathtools}

\usepackage{eqparbox}
\newcommand{\squash}[2][M]{\eqmakebox[#1]{$#2$}}

\begin{document}

These matrices are affected by the last matrices, which is bad:
\begin{align}
    A &=
    \begin{bmatrix}
        0 & \squash[A]{\sigma_2} \\[1em]
        \squash[A]{\sigma_2}& 0
    \end{bmatrix},
    \\
    B &=
    \begin{bmatrix}
        \squash[A]{-i \sigma_3} & 0 \\[1em]
        0 & \squash[A]{-i \sigma_3}
    \end{bmatrix},
\end{align}
These matrices are affecting the first matrices which is bad:
\begin{align}
    C &=
    \begin{bmatrix}
        0 & \squash[B]{1} \\[1em]
        \squash[B]{r \sin \vartheta \cos \varphi} & 0
    \end{bmatrix},
    \\
    D &=
    \begin{bmatrix}
        \squash[B]{-\, r^2} & 0 \\[1em]
        0 & \squash[B]{-\, r^2}
    \end{bmatrix},
\end{align}

\end{document}

在此处输入图片描述

我会使该参数成为强制性的,并为对齐添加一个可选参数,以获得更大的灵活性:

\newcommand{\squash}[3][c]{\eqmakebox[#2][#1]{$#3$}}

文档中的调用应该变成这样

\squash{A}{\sigma_2}

完整代码

\documentclass[11pt,letterpaper,twoside]{book}
\usepackage{lmodern}
\usepackage[total={6in,10in},left=1.5in,top=0.5in,includehead,includefoot]{geometry}
\usepackage{microtype}
\usepackage{amsfonts}
\usepackage{mathtools}

\usepackage{eqparbox}
\newcommand{\squash}[3][c]{\eqmakebox[#2][#1]{$#3$}}

\begin{document}

These matrices are affected by the last matrices, which is bad:
\begin{align}
    A &=
    \begin{bmatrix}
        0 & \squash{A}{\sigma_2} \\[1em]
        \squash{A}{\sigma_2}& 0
    \end{bmatrix},
    \\
    B &=
    \begin{bmatrix}
        \squash{A}{-i \sigma_3} & 0 \\[1em]
        0 & \squash{A}{-i \sigma_3}
    \end{bmatrix},
\end{align}
These matrices are affecting the first matrices which is bad:
\begin{align}
    C &=
    \begin{bmatrix}
        0 & \squash{B}{1} \\[1em]
        \squash{B}{r \sin \vartheta \cos \varphi} & 0
    \end{bmatrix},
    \\
    D &=
    \begin{bmatrix}
        \squash{B}{-\, r^2} & 0 \\[1em]
        0 & \squash{B}{-\, r^2}
    \end{bmatrix},
\end{align}

\end{document}

可选参数应该\squash是来自的字母lcr(表示“左”,“中”和“右”,默认为c)。

举个例子,如果你把全部变成,\squash{A}{...}再把\squash[l]{A}{...}全部\squash{B}{...}变成\squash[r]{B}{...},你会得到

在此处输入图片描述

在目前的情况下并不是很有用,但你可能会发现它在其他情况下很有用。

相关内容