这是我的 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}