Как обернуть команду LaTex в новой среде

На этот вопрос уже был дан ответ один раз ( оберните команду LaTeX в среду), но мне все еще трудно заставить работать свою собственную довольно простую команду новой среды.

Я хотел преобразовать следующий блок LaTex, который показывает вывод некоторого кода, в команду, которую я могу использовать повторно.

\fbox{\begin{minipage}{\textwidth}
\texttt{
>> CODE OUTPUT
\end{minipage}}

Ясно, что для создания новой команды среды, которая копирует то, что я делаю выше, мне придется использовать обертки. (Из-за команды \ fbox и \ texttt.)

Я хотел бы сделать это без необходимости загружать еще один пакет или заходить в секретные области LaTex с некоторой предопределенной командой \ dir, которая предназначена только для выполнения одной и той же работы дважды.

Проверяя ссылку ранее, кажется, что продуктивным решением является использование \bgroup и \egroup. Поэтому я бы написал что-то вроде этого:

\newenvironment{CodeOutput}
{\fbox\bgroup\begin{minipage}{\textwidth}\texttt\bgroup}
{\egroup\end{minipage}\egroup}

Но это все равно не сработает. (По крайней мере, на оборотной стороне). Было бы здорово, если бы существовал простой способ создания подобных команд. Спасибо за любые полезные предложения!

1 ответ

Если вы хотите написать команду, которая сделает то, что вам нужно, то подойдет следующее:

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

Идея здесь работает, потому что <arg>умен, поставленный \mycmd{<arg>} заменяется на #1в целом. Если вы хотите переписать это как среду, это немного сложнее, чисто из-за\fbox. \fboxне имеет аналогичного эквивалента в форме среды\texttt имеет \ttfamily(который технически является переключателем шрифта). Есть быстрый способ обойти это, предоставленный 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}}%
}

Следующий минимальный пример показывает все вышеперечисленные случаи:

\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}
Другие вопросы по тегам