(Re-)nuevo entorno que contiene el entorno mismo con un argumento en LaTeX

(Re-)nuevo entorno que contiene el entorno mismo con un argumento en LaTeX

¿Cómo puedo redefinir un entorno con un argumento como el entorno multicols? El objetivo es definir dos conjuntos de comandos, cada uno de ellos basado en el entorno multicols nativo:

\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}

Es importante para mí poder usar el segundo comando \begin{multicols}{some number}porque ya hay muchas apariciones de \begin{multicols}en mi documento. Así que crear dos entornos diferentes con \newenvironment{}dos nombres diferentes no me resulta útil.

Vi el acercamiento con el \LetLtxMacro\oldmulticols\multicolscomando en una respuesta deegregTratar el entorno de la figura que no requiere argumentos adicionales.

Mi problema es que no sé la sintaxis exacta para hacerlo. ¿Alguien puede ayudarme con este problema?

Respuesta1

No es necesario \LetLtxMacroen este caso. Más bien, no deberías redefinir el entorno con un argumento: simplemente pásalo a la macro guardada (a menos que necesites hacer algo al principio del entorno).

\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}

ingrese la descripción de la imagen aquí

Una estrategia diferente (y aún más flexible) es con 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}

Por razones de implementación, no es realmente posible definir un entorno en términos de multicols, porque éste lo comprueba explícitamente \end{multicols}.

Aquí hay un enfoque genérico que se puede combinar con el enfoque \BeforeBeginEnvironmenty \AfterEndEnvironmentpara agregar cosas al estándar 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}

Adición para la versión *

Con un poco de estiramiento, también podemos definir la versión * para cada entorno que definimos con \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}

información relacionada