%EC%83%88%20%ED%99%98%EA%B2%BD.png)
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
및 접근 방식 과 결합할 수 있는 일반적인 접근 방식은 다음과 같습니다 .\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}
* 버전에 대한 추가
약간의 확장을 통해 다음을 사용하여 정의하는 모든 환경에 대해 *-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}