newenvironment%2C%20%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B9%20%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D1%82%20%D1%81%D0%B0%D0%BC%D1%83%20%D1%81%D1%80%D0%B5%D0%B4%D1%83%20%D1%81%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%BC%20%D0%B2%20LaTeX.png)
Как я могу переопределить среду с аргументом, таким как среда multicols? Цель состоит в том, чтобы определить два набора команд, каждый из которых основан на собственной среде multicols:
\LetLtxMacro\oldmulticols\multicols
% first command
\newenvironment{mastermulticols}[1]
{ do some stuff \begin{\oldmulticols}{#1}
{\end{\oldmulticols} do some stuff}
% second command
\renewenvironment{multicols}[1]
{do some other stuff \begin{\oldmulticols}{#1}
{\end{oldmulticols} do some other stuff}
Для меня важно, чтобы я мог использовать вторую команду с, потому что в моем документе \begin{multicols}{some number}
уже много раз встречается . Поэтому создание двух разных сред с двумя разными именами не помогает мне.\begin{multicols}
\newenvironment{}
Я видел подход с \LetLtxMacro\oldmulticols\multicols
командой в ответеэгрегработа с фигурной средой, не требующей дополнительных аргументов.
Моя проблема в том, что я не знаю точного синтаксиса, чтобы это сделать. Может ли кто-нибудь помочь мне с этой проблемой?
решение1
В этом случае вам это не нужно \LetLtxMacro
. Вместо этого не следует переопределять среду с аргументом: просто передайте его сохраненному макросу (если только вам не нужно что-то сделать в самом начале среды).
\documentclass{article}
\usepackage{multicol}
\usepackage{lipsum}
\let\FMmulticols\multicols
\let\endFMmulticols\endmulticols
\renewenvironment{multicols}
{<some stuff before>\FMmulticols}
{\endFMmulticols<some stuff after>}
\begin{document}
\begin{multicols}{2}[\section{A section title to show it works}]
\lipsum[1-2]
\end{multicols}
\end{document}
Другая (и даже более гибкая) стратегия заключается в следующем etoolbox
:
\documentclass{article}
\usepackage{multicol}
\usepackage{etoolbox}
\usepackage{lipsum}
\BeforeBeginEnvironment{multicols}{%
<some stuff before>%
}
\AfterEndEnvironment{multicols}{%
<some stuff after>%
}
\begin{document}
\begin{multicols}{2}[\section{A section title to show it works}]
\lipsum[1-2]
\end{multicols}
\end{document}
По причинам реализации на самом деле невозможно определить среду в терминах multicols
, поскольку эта среда явно проверяет наличие \end{multicols}
.
Вот общий подход, который можно объединить с подходом \BeforeBeginEnvironment
и \AfterEndEnvironment
для добавления чего-либо в стандарт multicols
.
\documentclass{article}
\usepackage{multicol,etoolbox}
\usepackage{lipsum}
% keep copies of the original to be on the safe side
\let\FMmulticols\multicols
\let\endFMmulticols\endmulticols
\makeatletter
\newcommand{\newmulticolsenvironment}[3]{%
\newenvironment{#1}{#2\FMmulticols}{}%
\toks@=\expandafter{\endFMmulticols#3}%
\expandafter\edef\csname end#1\endcsname{\the\toks@}%
\expandafter\patchcmd\csname end#1\endcsname
{\@checkend{multicols}}
{\@checkend{#1}}
{}{}%
}
\newmulticolsenvironment{mastermulticols}
{<some stuff before>}
{<some stuff after>}
\begin{document}
\begin{mastermulticols}{2}[\section{A section title to show it works}]
\lipsum[1-2]
\end{mastermulticols}
\end{document}
Дополнение для *-версии
С некоторой натяжкой мы также можем определить *-версию для каждой среды, которую мы определяем с помощью \newmulticolsenvironment
:
\documentclass{article}
\usepackage{multicol,etoolbox}
\usepackage{lipsum}
% keep copies of the original to be on the safe side
\let\FMmulticols\multicols
\let\endFMmulticols\endmulticols
\letcs\FMmulticolsstar{multicols*}
\letcs\endFMmulticolsstar{endmulticols*}
\patchcmd{\FMmulticolsstar}{\begin{multicols}}{}{}{}
\patchcmd{\endFMmulticolsstar}{\end{multicols}}{}{}{}
\makeatletter
\newcommand{\newmulticolsenvironment}[3]{%
\newenvironment{#1}{#2\FMmulticols}{}%
\toks@=\expandafter{\endFMmulticols#3}%
\expandafter\edef\csname end#1\endcsname{\the\toks@}%
\expandafter\patchcmd\csname end#1\endcsname
{\@checkend{multicols}}
{\@checkend{#1}}
{}{}%
\newenvironment{#1*}
{#2\FMmulticolsstar\begin{#1}}
{\endFMmulticolsstar\end{#1}#3}%
}
\newmulticolsenvironment{mastermulticols}
{<some stuff before>}
{<some stuff after>}
\begin{document}
\begin{mastermulticols*}{2}[\section{A section title to show it works}]
\lipsum[1-4]
\end{mastermulticols*}
\end{document}