我发现这个很酷的帖子允许您在宏调用中包含一个 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
这应该可以满足您的要求。它采用链接的示例,并添加您的\fcolorbox
、minipage
等。
基本思想是,需要以这样一种方式捕获宏参数,即绝对最少的字符具有特殊含义 (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