如何将图形位置传递给 keyval 宏?

如何将图形位置传递给 keyval 宏?

我想在 figure-env 周围包装一个宏,以使我的文档更具可读性。下面是现在的最小示例:

\documentclass[10pt,a4paper]{article}
\usepackage{keyval}

\makeatletter

\define@key{image}{pos}{\def\i@pos{#1}} % define key-val
\setkeys{image}{pos=!htbp} % set default
\newcommand{\image}[2][]{%
  \begingroup%
  \setkeys{image}{#1}% set passed key-vals
  \begin{figure}[\i@pos] % use positon
    \centerline{\includegraphics[width=\textwidth]{#2}}
  \end{figure}
  \endgroup%}

\makeatother
\begin{document}
\end{document}

但似乎!htbp没有设置默认位置,因为如果我直接设置它,\begin{figure}[!htbp]它可以正常工作并且图像定位正确。

编辑: 我添加了\begin{document}\end{document}按照评论中的建议使其可编译。

我很感谢你的帮助。

答案1

\begin{figure}不扩展可选参数;当扩展发生时就太晚了。

\documentclass[10pt,a4paper]{article}
\usepackage{keyval}
\usepackage[demo]{graphicx}% draft is just for the example

\makeatletter

\define@key{image}{pos}{\def\i@pos{#1}} % define key-val
\setkeys{image}{pos=!htbp} % set default
\newcommand{\image}[2][]{%
  \begingroup
  \setkeys{image}{#1}% set passed key-vals
  \def\@temp{\begin{figure}}%
  \expandafter\@temp\expandafter[\i@pos]% use position
  \centering
  \includegraphics[width=\textwidth]{#2}
  \end{figure}
  \endgroup}

\makeatother

\begin{document}
Some text

\image[pos=!htbp]{foo}

Some other text
\end{document}

或者,由于赋予的值pos是由不可扩展的标记组成的,

\newcommand{\image}[2][]{%
  \begingroup
  \setkeys{image}{#1}% set passed key-vals
  \begingroup\edef\x{\endgroup
    \noexpand\begin{figure}[\i@pos]}\x % use position
  \centering
  \includegraphics[width=\textwidth]{#2}
  \end{figure}
  \endgroup}

在此处输入图片描述

相关内容