使用自定义命令强制数组环境中的列宽相等

使用自定义命令强制数组环境中的列宽相等

我定义了一个自定义命令tractorQ,它接受四个参数,并使用环境以矩阵形式对它们进行排版array

\newcommand{\tractorQ}[4]{
    \def\arraystretch{1.2}
    \left(
        \begin{array}{ccc}
            \multicolumn{3}{c}{#4} \\
            {#2} & | & {#3} \\
            \multicolumn{3}{c}{#1}
        \end{array}
    \right)
}

输入

\tractorQ{A}{BCDEFG}{H}{I}

产生输出

LaTeX 输出

但我想将管道水平居中,即强制array环境的第一列和第三列具有相同的宽度。我知道我可以手动或使用包array并定义使用自定义宽度的自定义列环境来为该符号的任何实例实现这一点。但是,这需要为该符号的每个实例分别设置自定义宽度,因为参数的\tractorQ宽度在不同实例之间差异很大。有没有办法编写一个命令来自动实现这一点?

答案1

一个简单的解决方案eqparbox。它需要第 1 列和第 3 列中的框名称作为可选参数(W默认情况下):

 \documentclass{article}
\usepackage{amsmath}
\usepackage{eqparbox}
\newcommand{\tractorQ}[5][W]{
\def\arraystretch{1.2}
        \begin{pmatrix}
        \multicolumn{3}{c}{#5} \\
          \eqmakebox[#1]{$ #3 $} & | & \eqmakebox[#1]{$ #4 $} \\
        \multicolumn{3}{c}{#2}
    \end{pmatrix}
}

\begin{document}

\[ \tractorQ{A}{BCDEFG}{H}{I} \]

\[ \tractorQ[X]{A}{BCD}{H}{I} \]

\end{document} 

在此处输入图片描述

答案2

包裹力量\fixTABwidth{T}的宏观tabstackengine全部如果对您有用,请将列宽设置为相等。已编辑将第 1 行和第 3 行放置在零宽度框中,以避免它们影响列宽。

在此 MWE 中,列间间隙设置为 0ex,行间基线跳跃设置为 14pt。

\documentclass{memoir} 
\usepackage{tabstackengine}
\setstacktabbedgap{0ex}
\setstackgap{L}{14pt}
\newcommand\tractorQ[4]{\fixTABwidth{T}\parenMatrixstack{%
  &\makebox[0pt]{#1}&\\#2&|&#3\\&\makebox[0pt]{$#4$}&}
}
\begin{document}
\[\tractorQ{A}{BCDEFG}{H}{I}\]
\[\tractorQ{A}{BCD}{H}{IJKLM}\]
\end{document}

在此处输入图片描述

答案3

根据包w提供的列类型采用不同的方法。arraycalc

\documentclass{article}
\usepackage{amsmath}
\usepackage{calc,array}

\newcommand{\tractorQ}[4]{%
  \left(
  \renewcommand{\arraystretch}{1.2}
  \begin{array}{
    @{}
    >{$}w{c}{\maxof{\widthof{$#2$}}{\widthof{$#3$}}}<{$}
    |
    >{$}w{c}{\maxof{\widthof{$#2$}}{\widthof{$#3$}}}<{$}
    @{}
  }
  \multicolumn{2}{c}{#4} \\
  #2 & #3 \\
  \multicolumn{2}{c}{#1} \\
  \end{array}\right)
}

\begin{document}

\[
\tractorQ{A}{BCDEFG}{H}{I}
\qquad
\tractorQ{A}{B}{H}{I}
\qquad
\tractorQ{A}{\begin{array}{@{}c@{}}XYZ\\W\end{array}}{H}{I}
\]

\end{document}

在此处输入图片描述

答案4

这个答案只是为了记录 Bernard 的有用答案中的代码修改,它产生了我想要的行为,但原始代码并不包含。\begin{document} ... \end{document}

\begin{document}

    \[ \tractorQ{A}{BCDEFG}{H}{I} , \tractorQ{J}{K}{L}{M} \]

\end{document}

这样调用多个实例tractorQ,就会产生输出

在此处输入图片描述

具体来说,参数W用作标签,告诉编译器哪些单元格的宽度要相等,它应用于tractorQ文档中的每个 实例。结果是包含参数的单元格大号比必要的要宽。

可以通过引入专用计数器来修改此行为,在两个实例中使用它作为参数\eqmakebox,并在每次tractorQ调用时增加它:

\documentclass{article}
\usepackage{amsmath}
\usepackage{eqparbox}

\newcounter{tractorQcounter}

\newcommand{\tractorQ}[4]{
    \def\arraystretch{1.2}
    \begin{pmatrix}
        \multicolumn{3}{c}{#4} \\
        \eqmakebox[\thetractorQcounter]{$#2$} & | & \eqmakebox[\thetractorQcounter]{$ #3 $} \\
        \multicolumn{3}{c}{#1}
    \end{pmatrix}
    \stepcounter{tractorQcounter}
}

\begin{document}

\[ \tractorQ{A}{BCDEFG}{H}{I} , \tractorQ{J}{K}{L}{M} \]

\end{document}

这将产生输出

在此处输入图片描述

相关内容