LaTeX의 인수를 사용하여 환경 자체를 포함하는 (재)새 환경

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나는 대답에서 명령 으로 접근 방식을 보았습니다 .egreg추가적인 인수가 필요 없는 그림 환경을 다루고 있습니다.

내 문제는 그렇게 하는 정확한 구문을 모른다는 것입니다. 이 문제를 해결하는 데 도움을 줄 수 있는 사람이 있나요?

답변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}

* 버전에 대한 추가

약간의 확장을 통해 다음을 사용하여 정의하는 모든 환경에 대해 *-version을 정의할 수도 있습니다 \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}

관련 정보