我正在制作一个有点复杂的图形,但在对齐某些行标题中的文本时遇到了麻烦。下面是显示我的问题的 MWE。
\documentclass{article}
\usepackage{graphicx}
\usepackage{multirow}
\begin{document}
\begin{figure*}
\centering
\def\rowheight{2cm} % Height of each row
\renewcommand{\arraystretch}{.5} % Space between rows inside block
\def\blockspace{5mm} % Space between blocks
\def\colwidth{.25\textwidth} % Width of each column
\setlength{\tabcolsep}{1mm} % Space between columns
\begin{tabular}{cc|ccc}
\multirow{2}{*}{\rotatebox[origin=c]{90}{Block 1}} &
\includegraphics[width=\colwidth,height=\rowheight]{example-image-a} &
\includegraphics[width=\colwidth,height=\rowheight]{example-image-b} &
\includegraphics[width=\colwidth,height=\rowheight]{example-image-c} &
\rotatebox[origin=r]{270}{Row 1} \\
& \includegraphics[width=\colwidth,height=\rowheight]{example-image-a} &
\includegraphics[width=\colwidth,height=\rowheight]{example-image-b} &
\includegraphics[width=\colwidth,height=\rowheight]{example-image-c} &
\rotatebox[origin=r]{270}{Row 2} \\[\blockspace]
\multirow{2}{*}{\rotatebox[origin=c]{90}{Block 2}} &
\includegraphics[width=\colwidth,height=\rowheight]{example-image-a} &
\includegraphics[width=\colwidth,height=\rowheight]{example-image-b} &
\includegraphics[width=\colwidth,height=\rowheight]{example-image-c} &
\rotatebox[origin=r]{270}{Row 1} \\
& \includegraphics[width=\colwidth,height=\rowheight]{example-image-a} &
\includegraphics[width=\colwidth,height=\rowheight]{example-image-b} &
\includegraphics[width=\colwidth,height=\rowheight]{example-image-c} &
\rotatebox[origin=r]{270}{Row 2} \\[\blockspace]
\multirow{2}{*}{\rotatebox[origin=c]{90}{Block 3}} &
\includegraphics[width=\colwidth,height=\rowheight]{example-image-a} &
\includegraphics[width=\colwidth,height=\rowheight]{example-image-b} &
\includegraphics[width=\colwidth,height=\rowheight]{example-image-c} &
\rotatebox[origin=r]{270}{Row 1} \\
& \includegraphics[width=\colwidth,height=\rowheight]{example-image-a} &
\includegraphics[width=\colwidth,height=\rowheight]{example-image-b} &
\includegraphics[width=\colwidth,height=\rowheight]{example-image-c} &
\rotatebox[origin=r]{270}{Row 2}
\end{tabular}
\end{figure*}
\end{document}
我希望两侧的所有标题都居中对齐,要么对齐各自的块(每个块由两行组成),要么对齐行本身。但是,当前配置并没有真正正确地对齐它们,而且在我测试时,其他配置的表现甚至更差origin=c
。origin=l
我该如何正确对齐侧边标题?或者,有没有比 更好的方法来布局这种图形tabular
?
答案1
正确的文本很容易处理。您只需添加adjustbox
包,添加valign=c
到每个图像,使它们的基线位于图像中间,然后使用\rotatebox[origin=c]...
;它将旋转并将文本放置在中间。此外,如果您有许多具有相同选项的图像,adjustbox
有一个很好的解决方案可以避免重复,\adjustboxset{...}
它会将内部指定的所有设置插入到每个实例中\includegraphics
。它可以在序言中全局设置,也可以在组中本地设置。
我发现旋转有点multirow
棘手。如果我使用除一行文本以外的任何其他内容,它通常会移动内容。添加一个小的调整可以纠正它;使用第三个可选参数。
最后要注意的是,尽量避免使用\def
。\newcommand
对于宏或\newlength\name
长度名称(后跟\setlength\name{...}
)都是更好的选择,因为它们会警告意外覆盖已定义的内容,而\def
默默地更改它们。
你的例子
\documentclass{article}
\usepackage{graphicx}
\usepackage[Export]{adjustbox}
\usepackage{multirow}
\newlength\rowheight
\newlength\colwidth
\newlength\blockspace
\newlength\smallspace
\newlength\multirowcor
\begin{document}
\begin{figure*}
\setlength\rowheight{2cm} % Height of each row
\setlength\colwidth{.25\textwidth} % Width of each column
\setlength\blockspace{1cm}
\setlength\smallspace{0.9cm}
\setlength\multirowcor{-5mm}
\adjustboxset{width=\colwidth,height=\rowheight,valign=c}
\centering
\renewcommand{\arraystretch}{.5} % Space between rows inside block
\setlength{\tabcolsep}{1mm} % Space between columns
\begin{tabular}{cc|ccc}
\multirow{2}*[\multirowcor]{\rotatebox[origin=c]{90}{Block 1}}
& \includegraphics{example-image-a}
& \includegraphics{example-image-b}
& \includegraphics{example-image-c}
& \rotatebox[origin=c]{270}{Row 1} \\[\smallspace]
& \includegraphics{example-image-a}
& \includegraphics{example-image-b}
& \includegraphics{example-image-c}
& \rotatebox[origin=c]{270}{Row 2} \\[\blockspace]
\multirow{2}*[\multirowcor]{\rotatebox[origin=c]{90}{Block 2}}
& \includegraphics{example-image-a}
& \includegraphics{example-image-b}
& \includegraphics{example-image-c}
& \rotatebox[origin=c]{270}{Row 1} \\[\smallspace]
& \includegraphics{example-image-a}
& \includegraphics{example-image-b}
& \includegraphics{example-image-c}
& \rotatebox[origin=c]{270}{Row 2} \\[\blockspace]
\multirow{2}*[\multirowcor]{\rotatebox[origin=c]{90}{Block 3}}
& \includegraphics{example-image-a}
& \includegraphics{example-image-b}
& \includegraphics{example-image-c}
& \rotatebox[origin=c]{270}{Row 1} \\[\smallspace]
& \includegraphics{example-image-a}
& \includegraphics{example-image-b}
& \includegraphics{example-image-c}
& \rotatebox[origin=c]{270}{Row 2}
\end{tabular}
\end{figure*}
\end{document}
答案2
这是一个用来 tikz
获得所需效果的解决方案。
如果你不熟悉tikz
,我不会推荐这个解决方案因为在能够按照你的意愿修改之前,还有很多事情需要弄清楚。只要知道几乎一切皆有可能tikz
。
在您的例子中,我没有使用表格,而是使用循环foreach
来放置图像。然后,我定义了一个名为的节点,该block
节点block
位于 和 之间cell00
,cell10
旋转 90° 并移动一点在 x 轴上。
然后,我将row1
和row2
节点定义为所需单元格右侧 25 个单位,并围绕其北锚旋转 -90°。
如果你问自己“为什么它必须这么复杂?”。这是因为它tikz
允许你做很多事情,并克服了table
例如 Anis 中存在的所有限制。
\documentclass{article}
\usepackage{graphicx}
%\usepackage{multirow}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{figure}[h]
\begin{tikzpicture}
\begin{scope}
\foreach \y in {0,1}{
\foreach \x in {0,1,2}{
\node (cell\y\x)at (4*\x,3*\y){\includegraphics[width=3cm]{example-image-a}};
}
}
\node[rotate=90](block) at ($(cell00)!0.5!(cell10) -(2,0)$) {block1};
\node[right of = cell02,right = 30,rotate=-90,anchor=north](row1) {Row1};
\node[right of = cell12,right = 30,rotate=-90,anchor=north](row2) {Row2};
\end{scope}
\begin{scope}[yshift=6cm]
\foreach \y in {0,1}{
\foreach \x in {0,1,2}{
\node (cell\y\x)at (4*\x,3*\y){\includegraphics[width=3cm]{example-image-a}};
}
}
\node[rotate=90](block) at ($(cell00)!0.5!(cell10) -(2,0)$) {block1};
\node[right of = cell02,right = 30,rotate=-90,anchor=north](row1) {Row1};
\node[right of = cell12,right = 30,rotate=-90,anchor=north](row2) {Row2};
\end{scope}
\end{tikzpicture}
\centering
\end{figure}
\end{document}