对齐旋转多行中的文本

对齐旋转多行中的文本

我正在制作一个有点复杂的图形,但在对齐某些行标题中的文本时遇到了麻烦。下面是显示我的问题的 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=corigin=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位于 和 之间cell00cell10旋转 90° 并移动一点在 x 轴上。

然后,我将row1row2节点定义为所需单元格右侧 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}

相关内容