为图形设置一个新环境,其中包含图形和标题

为图形设置一个新环境,其中包含图形和标题

这是我的 MWE,我想“重构”代码,这样当我将源代码导入文档时就不需要写太多东西:

\documentclass[12pt,a4paper]{article}
\usepackage[demo]{graphicx}
\usepackage{caption}
\usepackage{wrapfig}
\usepackage{lipsum}

\begin{document}

\begin{wrapfigure}{r}{0.5\textwidth}
  \begin{center}
    \includegraphics[width=0.6\textwidth]{foo}
  \end{center}
  \caption{The foo describes the bar}
  \label{img:foo}
\end{wrapfigure}

\lipsum

\end{document}

理想情况下我更愿意这样做:

\begin{mygraphic}{r}{0.5\textwidth}{The foo describes the bar}{img:foo}
    \includegraphics[width=0.6\textwidth]{foo}
\end{mygraphic}

我认为我需要做类似的事情:

\makeatletter
\newenvironment{mygraphic}[4]
{%begin part
\begin{wrapfigure}{#1}{#2}
  \begin{center}
}
{%end part
  \end{center}
  \caption{#3}
  \label{#4}
\end{wrapfigure}}
\makeatother

但是这不起作用。它抱怨标题和标签参数,所以我将它们移到了开始部分,但这不起作用。

答案1

您的定义不起作用,因为您不能在新环境定义的“结束部分”中使用参数;请参阅为什么环境的结束代码不能包含参数?已知的解决方法包括使用宏将参数存储在定义的“开始部分”,或使用环境包或使用解析包裹。

在这种特殊情况下,考虑到文档中提到的这个警告wrapfig

如果你将一个换行图放在 parbox 或 minipage 中,或者任何其他类型的分组中,则文本换行应该在组结束之前结束。

定义命令而不是环境似乎是一个更好的主意;类似这样的内容:

\documentclass[12pt,a4paper]{article}
\usepackage[demo]{graphicx}
\usepackage{caption}
\usepackage{wrapfig}
\usepackage{lipsum}

% syntax: \mygraphic[options for \includegraphics]{position}{width}{name}{caption}{label}
\newcommand\mygraphic[6][]{%
   \begin{wrapfigure}{#2}{#3}
   \centering\includegraphics[#1]{#4}
   \caption{#5}\label{#6}\end{wrapfigure}}

\begin{document}

\mygraphic[width=.6\linewidth]{r}{0.5\textwidth}{foo}{The foo describes the bar}{img:test}

\lipsum[1-7]

\end{document}

在此处输入图片描述

相关内容