(Re-)newenvironment, который содержит саму среду с аргументом в LaTeX

(Re-)newenvironment, который содержит саму среду с аргументом в LaTeX

Как я могу переопределить среду с аргументом, таким как среда 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}

Связанный контент