在我当前的文档中,我既有来自文件的图片,也有 tikz 图片。对于输出,我同时使用横向(用于屏幕阅读)和纵向(用于打印)。
对于从文件加载的图片,我使用代码来确保它们始终具有可接受的大小。
\begin{figure}
\centering
\includegraphics[keepaspectratio, width=1\textwidth, height=1\textheight]{Filename}
\caption{Figure}
\end{figure}
问题是我无法将其应用于我的 tikx 图片,因为它本身没有尺寸。我使用的是 $width=1\textwidth, height=1\textheight$,但这只意味着图片在纵向和横向模式下的纵横比会有所不同。
有没有简单的方法来定义 tikx 图片的纵横比(例如 4:3)?
编辑1
我以为我找到了一个简单的解决方案。
除了在我的示例中高度受文本高度限制、宽度受文本宽度限制外,我对 tikx 图片的高度和宽度使用相同的尺寸。唯一的区别是我使用了不同的因子。下面是一个简短的示例。
\begin{tikzpicture}
\begin{axis}[
width=0.80\textwidth,
height=0.60\textwidth,
...
使用此设置,图像的长宽比将始终为 4:3,宽度为文本的 80%。但问题是,如果使用其他值,图像的高度可能会超过一页(例如,长宽比为 1:1)。
有什么建议么?
答案1
adjustbox
包可用于改变任何类型的内容的大小,包括TiKZ
图形。
\documentclass{article}
\usepackage{adjustbox}
\usepackage{tikz}
\begin{document}
\def\test{\tikz\draw[thick, green] (0,0) rectangle (2cm,1cm) node[midway,red] {Test};}
% the original 2cm x 1cm
\test
% resized to 4cm x 2cm
\minsizebox{4cm}{2cm}{\test}
% keeps aspectratio
\minsizebox{1cm}{5cm}{\test}
\minsizebox{4cm}{1cm}{\test}
\end{document}
答案2
这是一个解决方案,使用某种方式缩放图像scalebox
以使其适合所需的尺寸(并保持纵横比)。
\documentclass[varwidth,border=50]{standalone}
\usepackage{environ}
\usepackage{tikz}
\usetikzlibrary{math}
% --------------------- begin macro definition
\newsavebox{\tikzbox}
% fitin environment
\NewEnviron{fitin}[2]{
\savebox{\tikzbox}{\BODY}
\tikzmath{\scale = min(#1/\wd\tikzbox, #2/(\ht\tikzbox+\dp\tikzbox));}
\scalebox{\scale}{\usebox{\tikzbox}}
}
% --------------------- end macro definition
\begin{document}
% the original 2cm x 1cm
\tikz \fill[green] (0,0) rectangle (2cm,1cm);
% fit in 8cm x 2cm => 4cm x 2cm
\begin{fitin}{8cm}{2cm}
\tikz \fill[green] (0,0) rectangle (2cm,1cm);
\end{fitin}
% fit in 8cm x 8cm => 8cm x 4cm
\begin{fitin}{8cm}{8cm}
\tikz \fill[green] (0,0) rectangle (2cm,1cm);
\end{fitin}
\end{document}
编辑:第一个解决方案不是特定于 tikz 的,并且这里有更好的解决方案,而无需scalebox
使用标准 tikz scale
。
\documentclass[varwidth,border=50]{standalone}
\usepackage{environ}
\usepackage{tikz}
% --------------------- begin macro definition
\newsavebox{\tikzbox}
% tikzfitin environment
\NewEnviron{tikzfitin}[2]{
\savebox{\tikzbox}{\BODY}
\tikzset{every picture/.style={scale = {min(#1/\wd\tikzbox, #2/(\ht\tikzbox+\dp\tikzbox))}}}
\BODY
}
% --------------------- end macro definition
\begin{document}
\def\test{\tikz\draw[thick, green] (0,0) rectangle (2cm,1cm) node[midway,red] {Test};}
% the original 2cm x 1cm
\test
% fit in 8cm x 2cm => 4cm x 2cm
\begin{tikzfitin}{8cm}{2cm}
\test
\end{tikzfitin}
% fit in 8cm x 8cm => 8cm x 4cm
\begin{tikzfitin}{8cm}{8cm}
\test
\end{tikzfitin}
\end{document}