理解 makeatletter 与 minted / minipage / colorboxes

理解 makeatletter 与 minted / minipage / colorboxes

我发现这个很酷的帖子允许您在宏调用中包含一个 minted 或 lstlisting 环境:

https://github.com/gpoore/minted/issues/54#issuecomment-58233667

代码

\makeatletter
\newcommand{\foo}{%
  \begingroup
  \let\do\@makeother\dospecials
  \catcode`\{=1
  \catcode`\}=2
  \endlinechar`\^^J
  \foo@i}
\newcommand{\foo@i}[1]{%
  \endgroup\scantokens{#1\noexpand}%
  \expandafter\foo@cleanup}
\def\foo@cleanup#1^^J{#1 }
%http://tex.stackexchange.com/questions/71049/allow-macro-to-end-without-new-line
\makeatother

我知道我可以使用保存框,但我不想。替换\foo\question我试图实现相当于

\newcommand{\question}[1]{
     \noindent\fcolorbox{black}{gray!11}{
         \begin{minipage}[t]{0.97\textwidth}
             \vspace*{1ex}
             #1
             \vspace*{1ex}
         \end{minipage}
     }
 }

问题是,在网上搜索了几个小时后,我还是无法清楚地了解这将如何工作。我尝试创建新环境,使用tcolorbox,以及许多不同的东西。当我\minipage{...}在第一部分之前使用\foo@i,然后\endminipage在 之前使用 时,我以为我取得了进展,但很快意识到它并没有像我想象的那样工作。在相同位置使用和 也是\endgroup如此。\tcolorbox\endtcolorbox

所以基本上,是否有可能使用begin类似minipage或的东西(t/f)colorbox并将其包裹起来?我无法将类似的东西\tcolorbox[colors etc]{\foo@i}}作为最后一行(紧接着\endlinechar),或者实际上任何其他变体。此时,无休止地改变这些命令的位置是徒劳的,我觉得我需要做些不同的事情。

感谢您的任何指点,例如一种获取{}进入的黑客方式。我尝试使用 catcodes,但我认为我错过了更大的图景。

我们的想法是在如下情况下使用宏:

\question{
\paragraph*{5: A question from my prof}
Consider some stuff about things i want you to solve:
\begin{minted}{matlab}
  for i = 1:n
    x(i) = x(i) + 1;
  end
\end{minted}
Show that this is a thing that can be done yay.
}

答案1

这应该可以满足您的要求。它采用链接的示例,并添加您的\fcolorboxminipage等。

基本思想是,需要以这样一种方式捕获宏参数,即绝对最少的字符具有特殊含义 (catcodes),以便几乎所有字符都可以按字面意思显示,但同时保留行尾 ( \endlinechar)。然后,在捕获参数后,下一个宏将用于\scantokens重新标记所有内容 (包括保留的行尾),以便它在实际使用时正常运行。

\makeatletter
\newcommand{\question}{%
  \begingroup
  \let\do\@makeother\dospecials
  \catcode`\{=1
  \catcode`\}=2
  \endlinechar`\^^J
  \question@i}
\newcommand{\question@i}[1]{%
  \endgroup
  \noindent\fcolorbox{black}{gray!11}{%
    \begin{minipage}[t]{0.97\textwidth}%
    \vspace*{1ex}%
    \scantokens{#1\noexpand}\par%
    \vspace*{1ex}%
    \end{minipage}%
  }%
  \expandafter\question@cleanup}
\def\question@cleanup#1^^J{#1 }
\makeatother

相关内容