1

这个问题已经回答过一次(在环境中包装 LaTeX 命令),但我仍然很难让我自己的相当简单的新环境命令工作。

我想做的是将以下显示一些代码输出的 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}

然而这仍然行不通。(至少在背面。)如果有一种直接的方式来制作这样的命令,那就太好了。感谢您提供任何有用的建议!

4

1 回答 1

3

如果想编写一个执行您所追求的命令,那么以下将起作用:

\newcommand{\mycmd}[1]{%
  \fbox{%
    \begin{minipage}{\dimexpr\linewidth-2\fboxrule-2\fboxsep}
      \ttfamily #1
    \end{minipage}%
  }%
}

这里的想法是有效的,因为<arg>提供给的 ument\mycmd{<arg>}#1全部替换。如果你想把它重写为一个环境,那就有点困难了,纯粹是因为\fbox. \fboxis 没有与相同的环境形式等效(技术上是字体切换)。有一种快速的解决方法- 它允许您在宏中捕获环境的内容:\texttt\ttfamilyenviron\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}}%
}

以下最小示例显示了上述所有情况:

在此处输入图像描述

\documentclass{article}

\usepackage{environ}

\newcommand{\mycmd}[1]{%
  \fbox{%
    \begin{minipage}{\dimexpr\linewidth-2\fboxrule-2\fboxsep}
      \ttfamily #1
    \end{minipage}%
  }%
}

\NewEnviron{myenvA}{%
  \fbox{%
    \begin{minipage}{\dimexpr\linewidth-2\fboxrule-2\fboxsep}
      \ttfamily \BODY
    \end{minipage}%
  }%
}

\newsavebox{\codebox}
\newenvironment{myenvB}{%
  \begin{lrbox}{\codebox}%
  \ttfamily\ignorespaces
}{%
  \end{lrbox}%
  \fbox{\begin{minipage}{\dimexpr\linewidth-2\fboxrule-2\fboxsep}
  \usebox{\codebox}%
  \end{minipage}}%
}

\begin{document}

\noindent
\fbox{\begin{minipage}{\dimexpr\linewidth-2\fboxrule-2\fboxsep}
\ttfamily SoMe CoDe HeRe
\end{minipage}}

\bigskip

\noindent
\mycmd{SoMe CoDe HeRe}

\bigskip

\noindent
\begin{myenvA}
SoMe CoDe HeRe
\end{myenvA}

\bigskip

\begin{lrbox}{\codebox}
\ttfamily SoMe CoDe HeRe
\end{lrbox}
\noindent
\fbox{\begin{minipage}{\dimexpr\linewidth-2\fboxrule-2\fboxsep}
\usebox{\codebox}
\end{minipage}}

\bigskip

\noindent
\begin{myenvB}
SoMe CoDe HeRe
\end{myenvB}

\end{document}
于 2019-12-11T04:48:42.153 回答