这个问题已经被回答过一次(wrap LaTeX command in environment),但是我仍然很难使自己的相当简单的新环境命令起作用。
我想做的是将下面显示某些代码输出的LaTex块转换为我可以重用的命令。
\fbox{\begin{minipage}{\textwidth}
\texttt{
>> CODE OUTPUT
\end{minipage}}
显然,为了制作一个新的环境命令来复制我在上面所做的工作,我将不得不使用包装器。 (由于\ fbox和\ texttt命令。)
我想这样做,而不必下载另一个软件包,也不必使用一些预定义的\ dir命令进入LaTex的秘密领域,而该命令只可以执行两次相同的工作。
从以前检查链接,看来有效的解决方案是使用\ bgroup和\ egroup。因此,我会这样写:
\newenvironment{CodeOutput}
{\fbox\bgroup\begin{minipage}{\textwidth}\texttt\bgroup}
{\egroup\end{minipage}\egroup}
然而,这仍然行不通。 (至少在Overleaf上。)如果有一种直接的方法来制作这样的命令,那将是很好的。感谢您提供任何有用的建议!
如果要编写执行所需操作的command,则可以使用以下命令:
\newcommand{\mycmd}[1]{%
\fbox{%
\begin{minipage}{\dimexpr\linewidth-2\fboxrule-2\fboxsep}
\ttfamily #1
\end{minipage}%
}%
}
这里的想法起作用,因为提供给<arg>
的\mycmd{<arg>}
ument被全部#1
取代。如果您想将其重写为environment,则由于\fbox
的原因,这会有些困难。 \fbox
没有与\texttt
具有\ttfamily
(从技术上来说是字体切换)相同的environment形式。 environ
提供了一种快速解决方案-它允许您在宏environ
中捕获环境的内容:
\BODY
但是,您可以通过捕获框内环境的内容,然后将框设置为\usepackage{environ}
\NewEnviron{myenvA}{%
\fbox{%
\begin{minipage}{\dimexpr\linewidth-2\fboxrule-2\fboxsep}
\ttfamily \BODY
\end{minipage}%
}%
}
内的选项:
\fbox
以下最小示例显示了以上所有情况:
\newsavebox{\codebox}% To store the content of myenvB
\newenvironment{myenvB}{%
\begin{lrbox}{\codebox}%
\ttfamily\ignorespaces
}{%
\end{lrbox}%
\fbox{\begin{minipage}{\dimexpr\linewidth-2\fboxrule-2\fboxsep}
\usebox{\codebox}%
\end{minipage}}%
}