我定义了一个自定义命令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}
产生输出
但我想将管道水平居中,即强制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&|\\&\makebox[0pt]{$#4$}&}
}
\begin{document}
\[\tractorQ{A}{BCDEFG}{H}{I}\]
\[\tractorQ{A}{BCD}{H}{IJKLM}\]
\end{document}
答案3
根据包w
提供的列类型采用不同的方法。array
calc
\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}
这将产生输出