尝试使用以下标记创建矩阵:
\begin{figure}
\centering
\[
\begin{blockarray}{cccccccc}
I & like & nlp & mlpr & enjoy & reading & books \\
\begin{block}{[ccccccc]c}
1 & 1 & 1 & 1 & 1 & 1 & 1 & I \\
1 & 1 & 1 & 1 & 1 & 1 & 1 & like \\
1 & 1 & 1 & 1 & 1 & 1 & 1 & nlp \\
1 & 1 & 1 & 1 & 1 & 1 & 1 & mlpr \\
1 & 1 & 1 & 1 & 1 & 1 & 1 & enjoy \\
1 & 1 & 1 & 1 & 1 & 1 & 1 & reading \\
1 & 1 & 1 & 1 & 1 & 1 & 1 & books \\
\end{block}
\end{blockarray}
\]
\caption{A caption to the entire figure}
\end{figure}
我得到的输出如下:
如您所见,矩阵的列间距不均匀。如果我能得到间距均匀的列,那就太好了。
有任何想法吗?
答案1
警告:我不是blkarray
专家;-)
但是,可以定义一种新的列类型(例如 B),blockarray
该列类型使用此说明符对所有列使用相同的宽度。
由于此功能有 7 列,因此可以缩短ccccccc
并替换为,*{7}B
就像在通常的表格环境中一样。
我必须要弄清楚,是否\BAnewcolumntype
支持带有参数的列类型。
\documentclass{article}
\usepackage{mathtools}
\usepackage{blkarray}
\BAnewcolumntype{B}{>{\centering}p{1cm}}
\begin{document}
\begin{figure}
\centering
$
\begin{blockarray}{cccccccc}
\text{I} & \text{like} & \text{nlp} & \text{mlpr} & \text{enjoy} & \text{reading} & \text{books} \\
\begin{block}{[*{7}B]c}
1 & 1 & 1 & 1 & 1 & 1 & 1 & \text{I} \\
1 & 1 & 1 & 1 & 1 & 1 & 1 & \text{like} \\
1 & 1 & 1 & 1 & 1 & 1 & 1 & \text{nlp} \\
1 & 1 & 1 & 1 & 1 & 1 & 1 & \text{mlpr} \\
1 & 1 & 1 & 1 & 1 & 1 & 1 & \text{enjoy} \\
1 & 1 & 1 & 1 & 1 & 1 & 1 & \text{reading} \\
1 & 1 & 1 & 1 & 1 & 1 & 1 & \text{books} \\
\end{block}
\end{blockarray}
$
\caption{A caption to the entire figure}
\end{figure}
\end{document}
答案2
该tabstackengine
包有一个固定宽度的数组选项,我在这里使用了它。因此,我只需要创建一个与单词“reading”宽度相同的“1”数组条目,其余部分就解决了。我用 完成了这个任务\tmpbox
。
该包还允许堆叠文本或数学,我在这里使用它将文本堆叠为文本,将数字堆叠为数学。
\documentclass{article}
\usepackage{tabstackengine}
\setstackEOL{\cr}
\setstacktabbedgap{1ex}
\fixTABwidth{T}
\begin{document}
\begin{figure}
\centering
\[
\stackText
\setbox0=\hbox{reading}
\savestack{\tmpbox}{\makebox[\wd0]{$1$}}
\savestack{\toprow}{\tabbedCenterstack{I & like & nlp & mlpr & enjoy & reading & books}}
\ensurestackMath{
\stackon{\bracketMatrixstack{
\tmpbox & 1 & 1 & 1 & 1 & 1 & 1 \cr
1 & 1 & 1 & 1 & 1 & 1 & 1 \cr
1 & 1 & 1 & 1 & 1 & 1 & 1 \cr
1 & 1 & 1 & 1 & 1 & 1 & 1 \cr
1 & 1 & 1 & 1 & 1 & 1 & 1 \cr
1 & 1 & 1 & 1 & 1 & 1 & 1 \cr
1 & 1 & 1 & 1 & 1 & 1 & 1
}}{\toprow}}
\Centerstack{ I \cr like \cr nlp \cr mlpr \cr enjoy \cr reading \cr books}
\]
\caption{A caption to the entire figure}
\end{figure}
\end{document}
列间间隙设置为 1ex \setstacktabbedgap{1ex}
。如果希望行间基线跳跃更大,\setstackgap{L}{1.2\baselineskip}
可以将该行添加到前导码中以实现以下结果:
[l]
最后,可以通过向 添加可选参数来将右侧的单词列左对齐\Centerstack
。
答案3
少一列、有 7 个块的变体,\Right{.}{text}
每个块的开头都有。我还使用该eqparbox
包来确保列宽相等,而不必反复试验才能找到合适的尺寸:
\documentclass{article}
\usepackage{mathtools}
\usepackage{blkarray}
\usepackage{eqparbox}
\BAnewcolumntype{B}{>{\centering}p{1cm}}
\begin{document}
\begin{figure}
\centering\makeatletter\setlength\tabcolsep{-10pt}\BA@colsep =1pt\makeatother
$
\begin{blockarray}{*{7}{c}}
\eqmakebox[C]{I} & \eqmakebox[C]{like} & \eqmakebox[C]{nlp} & \eqmakebox[C]{mlpr} & \eqmakebox[C]{enjoy} & \eqmakebox[C]{reading} & \eqmakebox[C]{books} \\
\begin{block}{*{7}{c}\Right{.}{I}}
1 & 1 & 1 & 1 & 1 & 1 & 1 \\
\end{block}
\begin{block}{*{7}{c}\Right{.}{like}}
1 & 1 & 1 & 1 & 1 & 1 & 1 \\
\end{block}
\begin{block}{*{7}{c}\Right{.}{nlp}}
1 & 1 & 1 & 1 & 1 & 1 & 1 \\
\end{block}
\begin{block}{*{7}{c}\Right{.}{mlpr}}
1 & 1 & 1 & 1 & 1 & 1 & 1 \\
\end{block}
\begin{block}{*{7}{c}\Right{.}{enjoy}}
1 & 1 & 1 & 1 & 1 & 1 & 1 \\
\end{block}
\begin{block}{*{7}{c}\Right{.}{reading}}
1 & 1 & 1 & 1 & 1 & 1 & 1 \\
\end{block}
\begin{block}{*{7}{c}\Right{.}{books}}
1 & 1 & 1 & 1 & 1 & 1 & 1 \\
\end{block}
\end{blockarray}
$
\caption{A caption to the entire figure}
\end{figure}
\end{document}