如何声明具有可变参数列表的宏?

如何声明具有可变参数列表的宏?

我正在寻找一个具有两个可选参数的宏,并尝试了以下代码:

\documentclass{tufte-handout}
%
\usepackage{xparse}
\usepackage{lipsum}
\usepackage[demo]{graphics}
\usepackage{easyfig}
%
%% Usage \mfig[position][trim]{name-figure}{caption}{label}
%
\NewDocumentCommand{\mfig}{o o m m m}{%
    \begin{marginfigure}[\IfValueTF{#1}{#1}{0}cm]
        \Figure[trim={.0\width} {\IfValueTF{#2}{#2}{.05}\height}%
            {.0\width} {.0\height},clip,%
            width=\linewidth,keepaspectratio=true,%
            caption={#4},label={#5},center,here]{#3}
    \end{marginfigure}%
}
%
\begin{document}

\section{A simple test}

\lipsum[1]
\mfig{myfigure}{This is just a caption to the demo figure.}{fig:test}
Figure~\ref{fig:test} shows a test. \lipsum[3].
\end{document}

第一个可选参数给出边距图形的垂直位置,第二个参数给出修剪坐标(实际上是一个下限截止点)。

可以使用:

\mfig[-1.5]{name}{caption}{label}

例如,将边距图形垂直向上移动约 1.5 厘米,并使用默认修剪坐标 .05,但我无法使用

\mfig[.55]{name}{caption}{label}

截断 55% 的图形,同时使用默认位置 0cm,因为我的“宏”无法识别可选参数 #2,除非明确使用 #1。

所以,我的问题是:有没有办法只指定#2 可选参数,而宏接受像上面一样的默认#1 参数?

答案1

为什么不使用钥匙呢?这样你就可以拥有尽可能多的参数如你所愿。

有很多方法可以实现这一点,下面是其中之一:

在序言中你可以

\usepackage{pgfkeys}
\def\mycaption{default caption}
\def\mylabel{default label}
\def\myfigwidth{0pt}
\def\myfigheight{0.05}
\pgfkeys{/jotagah/myfig/.cd,
  caption/.store in=\mycaption,
  label/.store in=\mylabel,
  fig width/.store in=\myfigwidth,
  fig height/.store in=\myfigheight,
  }

然后你可以将你的函数定义为

\NewDocumentCommand{\mfig}{om}{%
    \pgfkeys{/jotagah/myfig/.cd,
      fig width=0cm,
      fig height=0.05,
      #1}%%
    \begin{marginfigure}[\myfigwidth]
        \Figure[trim={.0\width} {\myfgheight\height}%
            {.0\width} {.0\height},clip,%
            width=\linewidth,keepaspectratio=true,%
            caption=\mycaption,label=\mylabel,center,here]{#2}
    \end{marginfigure}%

相关内容