考虑下面的宏:
\newcommand{\sxfigure}[4]{
\includegraphics[width=#1*#3 cm, height=#2*#3 cm]{#4}
}
#1
是#2
一些确定图形宽度和高度的值,#3
用于控制缩放比例。但是,上面的代码不起作用。有人能提供解决方案吗?我尝试了以下方法,仍然不起作用。有人能指出错误吗?
\usepackage{pgf}
\newcommand{\sxmultiply}[2]{\pgfmathparse{#1*#2}\pgfmathresult}
\newcommand{\sxfigure}[5]{
\begin{figure}
\begin{center}
\includegraphics[width=$\sxmultiply{#3}{#5}$ cm, height=$\sxmultiply{#4}{#5}$ cm]{#1}
\end{center}
\caption{#2}
\end{figure}
}
答案1
这fp
包裹是一个易于使用的算术包,可以在这里提供帮助:
\documentclass{article}
\usepackage{graphicx}% http://ctan.org/pkg/graphicx
\usepackage[nomessages]{fp}% http://ctan.org/pkg/fp
\newcommand{\sxfigure}[4]{%
\FPeval\widthdim{#1*#3}% Calculate width dimension
\FPeval\heightdim{#2*#3}% Calculate height dimension
\includegraphics[width=\widthdim cm, height=\heightdim cm]{#4}%
}
\begin{document}
\sxfigure{1}{2}{1.5}{example-image-a} \quad
\sxfigure{1}{2}{1.7}{example-image-a}
\end{document}
然而,我会选择使用键值方法的改进语法,原因正如第一段中提到的那样。xkeyval
文档:
在宏定义中使用键的优点是可以轻松避免最多 9 个参数,并且与使用大量(可选)参数相比,它可以减少宏语法中的混乱。例如,比较以下宏的可能语法,例如,宏
\mybox
可能使用其参数来绘制一些包含文本的框\mybox[5pt][20pt]{some text}[red][white][blue] \mybox[text=red,background=white,frame=blue,left=5pt,right=20pt]{some text}
请注意,为了能够在第一个示例中指定框架颜色,还需要指定其他颜色。这在第二个示例中不是必需的,这些颜色可以获取预设值。边距也是如此。
答案2
怎么样,使用calc
包裹
\newcommand{\sxfigure}[5]{%
% #1: width
% #2: height
% #3: zoom ratio
% #4: image
% #5: caption
\begin{figure}[!htb]
\centering
\includegraphics[width={#1*#3}, height={#2*#3}]{#4}
\caption{#5}
\end{figure}
}
请注意,我使用了mwe
只是为了图像。
\documentclass{article}
\usepackage{graphicx}
\usepackage{calc}
\usepackage{mwe}
\newcommand{\sxfigure}[5]{%
% #1: width
% #2: height
% #3: zoom ratio
% #4: image
% #5: caption
\begin{figure}[!htb]
\centering
\includegraphics[width={#1*#3}, height={#2*#3}]{#4}
\caption{#5}
\end{figure}
}
\begin{document}
\sxfigure{1cm}{1cm}{2}{example-image-a}{my caption}
\sxfigure{1cm}{1cm}{4}{example-image-b}{my other caption}
\end{document}
想必你也想要\label
这些图片,所以也许下面的内容会更好
\newcommand{\sxfigure}[6]{%
% #1: width
% #2: height
% #3: zoom ratio
% #4: image
% #5: caption
% #6: label
\begin{figure}[!htb]
\centering
\includegraphics[width={#1*#3}, height={#2*#3}]{#4}
\caption{#5}
\label{#6}
\end{figure}
}
请注意,我已经使用\centering
了我应该对图形和表格使用 center 还是 centering ?
答案3
在您的情况下,由于您使用#3
(#5
在第二个示例中)仅进行缩放(因子在width
和height
键中都相乘),因此您只需使用:
\newcommand{\sxfigure}[4]{
\includegraphics[width=#1, height=#2, scale=#3]{#4}
}
并像使用它一样
\sxfigure{<width length>}{<height length>}{<scale factor>}{<file>}
该calc
包可以进行简单的乘法,但使用pgf
可以进行各种计算,例如:
\sxfigure[angle=30]{
image width = 1.1^3*3cm,
image height = exp(3)*3cm
}{example-image}
代码
\documentclass{article}
\usepackage{graphicx}
\usepackage{pgf}
\newlength{\includewidth}
\newlength{\includeheight}
\pgfset{
image width/.code={
\pgfmathsetlength\includewidth{#1}
},
image height/.code={
\pgfmathsetlength\includeheight{#1}
},
}
\newcommand{\sxfigure}[3][]{% #1 = \includegraphics key-value stuff
% #2 = width and height assignments
% #3 = the file
\pgfset{#2}%
\includegraphics[width=\includewidth, height=\includeheight,#1]{#3}%
}%
\newcommand{\sxFigure}[4][]{% #1 = \includegraphics key-value stuff
% #2 = width
% #3 = height
% #4 = the file
\pgfmathsetlength\includewidth{#2}%
\pgfmathsetlength\includeheight{#3}%
\includegraphics[width=\includewidth, height=\includeheight,#1]{#4}%
}%
\begin{document}
\sxfigure[angle=30]{image width = 2.5*3cm, image height = 3*3cm}{example-image}
\sxFigure[angle=30]{2.5*3cm}{3*3cm}{example-image}
\end{document}
输出
答案4
e-TeX\dimexpr
可用于:
\newcommand{\sxfigure}[4]{%
\includegraphics[width=#3\dimexpr#1cm\relax, height=#3\dimexpr#2cm\relax]{#4}%
}