将命名参数传递给宏

将命名参数传递给宏

我注意到它includegraphics采用了看似命名的参数:

\includegraphics[width=50,height=25,trim=1 2 3 4,clip]{an_img.png}

我想将我的一些includegraphics调用包装在一个宏中,以便以下命令

\happygraphics{an_img.png}
\happygraphics{an_img.png}{rotate=90}

扩大至

\includegraphics[width=50,height=25,trim=1 2 3 4,clip]{an_img.png}
\includegraphics[width=50,height=25,trim=1 2 3 4,clip,rotate=90]{an_img.png}

分别。

我试过使用

\DeclareDocumentCommand\song{ m g }{
  \includegraphics[width=50,height=25,trim=1 2 3 4,clip,rotate=90\IfNoValueF{#2}{,#2}]{#1}
}

但我得到了可怕的

! Package keyval Error: keepaspectratio,trim=0 0 0.5in 0,clip undefined.

错误。

我该如何做呢?

答案1

通过定义稍微修改的接口

\newcommand{\happygraphics}[2][,]{%
  \includegraphics[width=50,height=25,trim=1 2 3 4,clip,#1]{#2}}%

将允许根据需要添加选项\happygraphics[<options>]{<file>}

类似的接口通过xparse

\usepackage{xparse}% http://ctan.org/pkg/xparse
\NewDocumentCommand{\happygraphics}{O{,} m}{%
  \includegraphics[width=50,height=25,trim=1 2 3 4,clip,#1]{#2}}%

上述利用了提供空(默认)键值作为的优势,

由于键值接口可以接受空选项(或连续的逗号,,,...),因此无需额外测试可选参数是否存在。当然,除非您想根据用户是否提供了可选参数来做更多的事情。

答案2

你不需要定义新的顶级命令,如果你执行

\setkeys{Gin}{width=50,height=25,trim=1 2 3 4,clip}

那么这些键将被自动设置为声明\includegraphics范围内的所有内容\setkeys

相关内容