(Re-)newenvironment, das die Umgebung selbst mit einem Argument in LaTeX enthält

(Re-)newenvironment, das die Umgebung selbst mit einem Argument in LaTeX enthält

Wie kann ich eine Umgebung mit einem Argument wie der Multicols-Umgebung neu definieren? Das Ziel besteht darin, zwei Befehlssätze zu definieren, von denen jeder auf der nativen Multicols-Umgebung basiert:

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

Mir ist es wichtig, dass ich den zweiten Befehl mit verwenden kann, \begin{multicols}{some number}da es in meinem Dokument bereits viele Vorkommen von gibt \begin{multicols}. Daher ist es für mich nicht hilfreich, zwei verschiedene Umgebungen mit \newenvironment{}zwei unterschiedlichen Namen zu erstellen.

Den Ansatz mit dem \LetLtxMacro\oldmulticols\multicolsBefehl habe ich in einer Antwort von gesehenegregUmgang mit der Figurenumgebung, die kein zusätzliches Argument benötigt.

Mein Problem ist, dass ich die genaue Syntax dafür nicht kenne. Kann mir jemand bei diesem Problem helfen?

Antwort1

In diesem Fall ist das nicht nötig \LetLtxMacro. Sie sollten die Umgebung vielmehr nicht mit einem Argument neu definieren: Übergeben Sie es einfach an das gespeicherte Makro (es sei denn, Sie müssen ganz am Anfang der Umgebung etwas tun).

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

Bildbeschreibung hier eingeben

Eine andere (und noch flexiblere) Strategie ist mit 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}

Aus Implementierungsgründen ist es nicht wirklich möglich, eine Umgebung in Bezug auf zu definieren multicols, da diese explizit auf prüft \end{multicols}.

\BeforeBeginEnvironmentHier ist ein allgemeiner Ansatz, der mit dem und \AfterEndEnvironmentAnsatz zum Hinzufügen von Inhalten zum Standard kombiniert werden kann 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}

Ergänzung für die *-Version

Mit etwas Aufwand können wir auch die *-Version für jede Umgebung definieren, die wir mit definieren \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}

verwandte Informationen