Marginfigures、环境和 scrlayer-notecolumn

Marginfigures、环境和 scrlayer-notecolumn

我正在用 Sweave ( knitr) 写一篇文章,这是一个从统计语言R到 TeX 的翻译器。每当我在 Sweave 中生成一个图形时,它都会返回类似以下图形代码的内容。

\begin{figure}
\begin{knitrout}\small
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}

{
\centering \includegraphics[width=\marginparwidth]{example-image-a} 
}

\end{knitrout}
\caption{A caption.}
\label{fig:a-label}
\end{figure}

我想要做的是使用类似于以下的解决方案marginfigure通过包实现自定义环境scrlayer-notecolumn这里。但是,我遇到了Too many {'s.无法恢复的错误。

我想要的是这样的:

\begin{marginfigure}
\begin{knitrout}\small
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}

{
\centering \includegraphics[width=\marginparwidth]{example-image-a}
}

\end{knitrout}
\end{marginfigure}

我对marginfigure环境进行了如下编码:

\usepackage{environ}

\makeatletter
\NewEnviron{marginfigure}{%      
  \expandafter\@marginfigure\expandafter{\BODY}%
}
\newcommand*\@marginfigure[1]{%
  \makenote*{%
    \begin{nonfloatfigure}#1\end{nonfloatfigure}%
  }%
}
\newenvironment{nonfloatfigure}{%
  \par\noindent\begin{minipage}{\linewidth}
    \def\@captype{figure}%
}{%
  \end{minipage}
}

正在做

\makenote*{
\begin{knitrout}\small
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}

{
\centering \includegraphics[width=\marginparwidth]{example-image-a}
}

\end{knitrout}
}

另一方面,工作得很好。

以下是不起作用的示例:

\documentclass{scrartcl}
\usepackage{scrlayer-scrpage}
\usepackage{scrlayer-notecolumn}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{environ}

\makeatletter
\NewEnviron{marginfigure}{%
  \expandafter\@marginfigure\expandafter{\BODY}%
}
\newcommand*\@marginfigure[1]{%
  \makenote*{%
    \begin{nonfloatfigure}#1\end{nonfloatfigure}%
  }%
}
\newenvironment{nonfloatfigure}{%
  \par\noindent\begin{minipage}{\linewidth}
    \def\@captype{figure}%
}{%
  \end{minipage}
}

\newenvironment{knitrout}{}{} % provided from Sweave

\title{Hello}
\author{Me}

\begin{document}
\maketitle

% Does not work
\begin{marginfigure}
\begin{knitrout}\small
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}

{
\centering \includegraphics[width=\marginparwidth]{example-image-a}
} 

\end{knitrout}
\end{marginfigure}

\end{document}

答案1

您的环境包含段落。这意味着内部命令应该很长,因此不要使用带星号的 \newcommand:

\documentclass{scrartcl}
\usepackage{scrlayer-scrpage}
\usepackage{scrlayer-notecolumn}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{environ}

\makeatletter
\NewEnviron{marginfigure}{%
  \expandafter\@marginfigure\expandafter{\BODY}%
}
\newcommand\@marginfigure[1]{% not \newcommand*
  \makenote*{%
    \begin{nonfloatfigure}#1\end{nonfloatfigure}%
  }%
}
\newenvironment{nonfloatfigure}{%
  \par\noindent\begin{minipage}{\linewidth}
    \def\@captype{figure}%
}{%
  \end{minipage}
}

\newenvironment{knitrout}{}{} % provided from Sweave

\title{Hello}
\author{Me}

\begin{document}
\maketitle

% Does not work
\begin{marginfigure}
\begin{knitrout}\small
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}

{
\centering \includegraphics[width=\marginparwidth]{example-image-a}
}

\end{knitrout}
\end{marginfigure}

\end{document}

在此处输入图片描述

相关内容