我想要的是类似的东西\resizebox
,但我可以给出最大高度和宽度,它将使其适合这些边界,并且不会扭曲图像。(\resizebox
当然,除非您使用,否则总是会使其适合您提供的精确尺寸!
。如果你做使用!
,您必须确定是否要设置高度或宽度尺寸。)
因此,我尝试编写一个,但我在使用\ratio
该calc
包的命令时遇到了问题。每当我使用时\ratio
,都会收到“缺少数字,请重试”的消息。
我做错了什么?(如果您对我原来的问题有更好的建议,当然,我也会接受。)
\documentclass{article}
\usepackage{settobox}
\usepackage{etoolbox}
\usepackage{calc}
\newsavebox{\theCurrentImage}
\newlength{\theCurrentImageHeight}
\newlength{\theCurrentImageWidth}
\newlength{\heightIfWidthExpanded}
\newlength{\widthIfHeightExpanded}
\newrobustcmd{\image}[1]{%
\sbox{\theCurrentImage}{#1}%
\settoboxheight{\theCurrentImageHeight}{\theCurrentImage}%
\settoboxwidth{\theCurrentImageWidth}{\theCurrentImage}%
% If the aspect ratio of the image is wider than the aspect ratio of the
% screen, we are limited by the text width. Otherwise, we are limited by
% the text height.
Image width: \the\theCurrentImageWidth \\
Image height: \the\theCurrentImageHeight \\
Text width: \the\textwidth \\
Text height: \the\textheight \\
\ifnumcomp{\ratio{1pt}{1pt}} %\ratio{\theCurrentImageWidth}{\theCurrentImageHeight}
{>}{\ratio{1pt}{1pt}} %\ratio{\textwidth}{\textheight}
{% Width limited
Width limited \\
\resizebox{\textwidth}{!}{\usebox{\theCurrentImage}}%
}%
{% Height limited
Height limited \\
\resizebox{!}{\textheight}{\usebox{\theCurrentImage}}%
}%
}
\begin{document}
\image{Hello world!}
\end{document}
答案1
伊恩的回答给我指明了正确的方向:这很容易实现adjustbox
Martin Scharrer 的软件包。它基本上为您提供了一个\includegraphics
类似于的界面,可与任何(可装箱)材料一起使用:
\documentclass{article}
\usepackage{adjustbox}
\begin{document}
\adjustbox{width=400pt,height=800pt,keepaspectratio=true}{Hello, World}
\end{document}
答案2
使用 时\includegraphics
,您可以指定高度、宽度以及是否希望保留纵横比。使用 选项keepaspectratio=true
,图像将尽可能大,但不超过指定的高度或宽度。
\includegraphics[width=400pt,height=800pt,keepaspectratio=true]{myfile}
有关 接受的选项的详细信息\includegraphics
,请参阅epslatex.pdf。
更一般地,你可以制作两个盒子:
- 原始对象,缩放以使其宽度等于可用的总宽度,
- 原始对象,按比例缩放,以使其高度等于可用的总高度。
您想要的盒子永远是这两个盒子中较小的一个。
\documentclass{article}
\usepackage{graphicx}
\newcommand{\myscale}[1]{%
\newbox\bigbox
\newbox\anotherbigbox
\sbox\bigbox{\resizebox{\textwidth}{!}{#1}}%
\sbox\anotherbigbox{\resizebox{!}{\textheight}{#1}}%
\newdimen\bigboxwidth
\newdimen\anotherbigboxwidth
\bigboxwidth=\wd\bigbox
\anotherbigboxwidth=\wd\anotherbigbox
\ifnum\bigboxwidth<\anotherbigboxwidth\usebox\bigbox\else\usebox\anotherbigbox\fi
}%
\begin{document}
\noindent
\myscale{\rule{10pt}{1pt}}
\newpage
\myscale{\rule{1pt}{10pt}}
\end{document}
答案3
除了使用我adjustbox
在 Daniel 的接受答案中提到的包之外,您还可以使用内部 if 开关来\resizebox
为您完成工作。keepaspectratio
选项\includegraphics
(来自与 , 相同的包\resizebox
)graphicx
只需将Gin@iso
开关设置为 true。 此 for 没有公共接口\resizebox
,但您可以使用\Gin@isotrue
它在本地进行设置,可以在\makeatletter
..之间进行设置\makeatother
,也可以使用\csname Gin@isotrue\endcsname
:
{\csname Gin@isotrue\endcsname
\resizebox{<height>}{<width>}{<content>}}
height=<height>,width=<width>,keepaspectratio
这与使用\includegraphics
或相同。\adjustbox
但是{adjustbox}
,后两个将内容作为框而不是宏参数处理,因此允许逐字内容。