使用 calc 包划分长度时遇到问题

使用 calc 包划分长度时遇到问题

我想要的是类似的东西\resizebox,但我可以给出最大高度和宽度,它将使其适合这些边界,并且不会扭曲图像。(\resizebox当然,除非您使用,否则总是会使其适合您提供的精确尺寸!。如果你使用!,您必须确定是否要设置高度或宽度尺寸。)

因此,我尝试编写一个,但我在使用\ratiocalc包的命令时遇到了问题。每当我使用时\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

伊恩的回答给我指明了正确的方向:这很容易实现adjustboxMartin 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},后两个将内容作为框而不是宏参数处理,因此允许逐字内容。

相关内容