graphicx 宏包提供一组命令,可以把内容放入一个 *盒子*,再旋转、缩放或镜像它。对象不必是图像:一句文字、一个公式、整个 tabular 表格,只要能放进盒子里都可以变形。本页介绍四个命令:\rotatebox(旋转)、\scalebox(按倍率缩放)、\reflectbox(水平镜像)和 \resizebox(缩放到目标尺寸),并整理它们的核心区别:是指定 *倍率*,还是指定 *目标尺寸*。
graphicx 的盒子变形命令
要使用这些命令,需要在导言区载入 \usepackage{graphicx}。尽管名字像是图像专用,但并非如此。graphicx 定义的变形命令——\rotatebox、\scalebox、\resizebox(以及带星号的 \resizebox*)和 \reflectbox——都以同样方式工作:先把参数内容排进一个盒子,再变形整个盒子。因此可变形的不只是图像(\includegraphics),还包括正文片段、公式、表格等 任何能放进盒子的材料。
理解这些命令的主线,是区分“用倍率指定”和“用目标尺寸指定”。\scalebox 接受 相对倍率,例如“原来的 0.8 倍”“放大 2 倍”。相对地,\resizebox 接受 绝对的最终尺寸,例如“宽 5cm”“铺满正文宽度”,再反算需要的倍率。\rotatebox 指定角度,\reflectbox 负责镜像。下表给出概览。
| 命令 | 指定内容 | 效果 |
|---|---|---|
\rotatebox | 角度(度) | 将内容逆时针旋转 |
\scalebox | 倍率(相对) | 按倍率放大或缩小内容 |
\reflectbox | (无) | 水平镜像内容 |
\resizebox | 目标宽度和高度(绝对) | 把内容缩放到该尺寸 |
旋转 - \rotatebox
\rotatebox{angle}{content} 会把内容放入盒子,并按给定 角度(以度为单位)逆时针 旋转。正角度向左转,负角度向右转。例如 \rotatebox{90}{...} 会把内容竖起,好像纵向排版;\rotatebox{-90}{...} 则向相反方向倒下。
これは \rotatebox{45}{斜めの文字} です。
This is \rotatebox{45}{slanted text}.在这个例子中,只有“斜めの文字”和“slanted text”部分会围绕左下角抬起 45 度,周围正文仍保持水平。请注意,旋转后的盒子比原来更高,因此所在行的高度也会随之增大。
旋转轴(中心)可以用可选参数 [origin=...] 改变。origin 可由 l(左)、r(右)、c(中心)、t(上)、b(下)、B(基线)中的一个或两个组合而成。例如 \rotatebox[origin=c]{180}{...} 会以 盒子的中心 为轴旋转 180 度,使其上下倒置。默认轴是 lB(左侧基线)。若要更细致地控制,可用 x= 和 y= 指定任意支点,用 units= 改变角度单位本身(units=-360 表示顺时针,units=6.283185 表示弧度)。
\rotatebox[origin=c]{180}{さかさま}\quad\rotatebox{90}{タテ}按倍率缩放和镜像 - \scalebox 与 \reflectbox
\scalebox{factor}{content} 会按 倍率 缩放内容。\scalebox{2}{...} 表示放大两倍,\scalebox{0.5}{...} 表示缩小到一半。倍率会同样作用于横向和纵向,因此形状(纵横比)保持不变。
如果想分别伸缩横向和纵向,可把 纵向倍率 作为第二个(可选)参数给出。格式是 \scalebox{h-factor}[v-factor]{content}。\scalebox{1}[2]{...} 保持宽度不变,只把高度拉到两倍;\scalebox{0.8}[1.2]{...} 让宽度变为 0.8 倍、高度变为 1.2 倍。省略纵向倍率时,它默认等于横向倍率,于是得到等比例缩放。
\scalebox{2}{大きく}\quad\scalebox{0.5}{小さく}\quad\scalebox{1}[2]{縦長}倍率也可以是 负值,这会沿相应轴反转。\scalebox{-1}[1]{...} 表示横向倍率 -1、纵向倍率 1,也就是 水平镜像(镜文字)。这种用法很常见,所以 graphicx 提供了专用简写 \reflectbox{content}:它与 \scalebox{-1}[1]{...} 完全等价。同样,\scalebox{1}[-1]{...} 表示 上下翻转。
Able was I \reflectbox{Able was I}在这个例子中,“Able was I” 后面会接着排出它的镜像,也就是同一个短语的左右翻转。
缩放到目标尺寸 - \resizebox
\resizebox{width}{height}{content} 会把内容缩放到 指定的最终尺寸。\scalebox 是“原来的多少倍”这样的相对指定,而 \resizebox 接受 绝对目标尺寸,如“宽 5cm”“高 2cm”,再由 LaTeX 计算达到该尺寸所需的倍率。\resizebox{3cm}{2cm}{...} 会把内容分别在横向和纵向拉伸到正好宽 3cm、高 2cm。
如果想保持纵横比,只固定一个方向的尺寸,就在另一个方向放 感叹号 !。写 ! 的方向会直接复用由已指定尺寸算出的倍率。这是该命令最常见的形式:例如 \resizebox{\textwidth}{!}{...} 表示 宽度正好等于正文宽度,高度按比例缩放。\resizebox{!}{1cm}{...} 则表示高度为 1cm,宽度随之按比例变化。
在尺寸参数中,可以使用表示内容原始尺寸的 \width、\height、\totalheight、\depth。\resizebox{2\width}{!}{...} 表示“宽度变为原来的两倍”。带星号的 \resizebox*{width}{height}{content} 会把第二个参数解释为 高度 + 深度(总高度,包括基线以下的下探部分);无星号形式只计算基线以上的高度。
% 元の幅の倍に
\resizebox{2\width}{!}{倍の幅}
% 高さ 1cm、横は比例
\resizebox{!}{1cm}{Tall}缩小过宽的表格
\resizebox 最常见的实际用途,是 把超出正文宽度的表格缩小到能放下。用 \resizebox{\textwidth}{!}{...} 包住整个 tabular 环境,整张表就会缩小到正好等于正文宽度。盒子变形命令不关心内部是什么,因此表格也能照样适用。
\resizebox{\textwidth}{!}{%
\begin{tabular}{lrrr}
項目 & 第1四半期 & 第2四半期 & 第3四半期 \\
\hline
売上 & 120 & 138 & 151 \\
費用 & 80 & 84 & 90 \\
\end{tabular}%
}不过,这个技巧是 双刃剑。因为 \resizebox 会把表格中的 文字也一起缩放,如果缩得很厉害,字体会比正文更小,甚至难以阅读,并且与周围正文的字面不再协调。之后再为表格重新指定字体大小也无效,因为最终整个盒子都会被缩小。因此,正确做法通常是先通过调整列宽、使用 \small 一类命令或删减列,让 表格本身适应宽度;\resizebox 应作为最后手段。详情请参阅表格布局页面。
更高层的替代:adjustbox
graphicx 的命令简单而强大,但组合使用时容易形成很深的嵌套。用 \usepackage{adjustbox} 载入的 adjustbox 宏包,是一个更高层的替代方案,把这些功能统一成 \includegraphics 风格的 键=值接口。使用 \adjustbox{key=value,...}{content},可以一次指定 angle=(旋转)、scale=(倍率)、width= / height=(目标尺寸)、reflect(镜像)等;它也提供同名的 adjustbox 环境。
\adjustbox{angle=45,scale=0.8}{まとめて変形}
\adjustbox{max width=\textwidth}{%
\begin{tabular}{lrr} ... \end{tabular}%
}特别方便的是 max width=\textwidth(以及 max totalheight= 等)。前一节的 \resizebox{\textwidth}{!}{...} 即使表格比正文宽度窄,也会把它 放大;而 max width= 只会在内容溢出时缩小,已经放得下时 保持不动。因此,能放下的表格会保持与正文相同的字面,只有过宽的表格才会缩小。对于经常使用旋转、缩放、镜像的文档,或想干净处理溢出的场景,adjustbox 更容易使用。