LaTeX で引数付きの環境自体を含む (再) 新しい環境

LaTeX で引数付きの環境自体を含む (再) 新しい環境

multicols 環境などの引数を使用して環境を再定義するにはどうすればよいですか? 目標は、ネイティブの multicols 環境に基づいて、2 つのコマンド セットを定義することです。

\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}既に が多数出現しているので、 の2 番目のコマンドを使用できることは私にとって重要です。したがって、 で 2つの異なる名前を持つ 2 つの異なる環境を作成することは、私にとって役に立ちません。\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およびアプローチと組み合わせることができる一般的なアプローチを示します。\AfterEndEnvironmentmulticols

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

関連情報