Как обернуть команду 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}