KTUG 한국 텍 사용자 그룹

Menu

KTUG :: 마당정보글 › xparse와 environ

yihoze | 2017.02.20 16:49:46 | 메뉴 건너뛰기 쓰기

xparse 패키지를 이용하여 이런 명령을 만들었다고 치자.

\NewDocumentCommand \foo { O{} d() d<> m }

그런데 이런저런 이유로 이것을 환경으로 바꾸어 쓰고 싶다고 가정하자. 

\NewEnviron{FOO}[1][]{ foo[#1]{\BODY} }

여기에서 \foo 명령의 다른 옵션 인자들을 쓸 수 없다는 것이 못내 아쉽다. 어찌어찌 하면 이 문제가 풀릴 것 같은데 바람과 달리 쉽지 않다. 알아두어야 할 것은 \NewEnviron에 의해 만들어진 환경을 이용하여 새로운 환경을 만들 수 없다는 것이다. 예를 들어, 다음과 같은 정의는 오류를 일으킨다. (\foo 뒤에 오는 것들이 즉시 읽혀야 하기 때문인 듯하다.)

\NewDocumentEnvironment { GOO } {}
{ \begin{FOO} }
{ \end{FOO} }

(제한적이지만 쓸 만한) 해법은 이렇다.

1. \NewEnviron 명령을 이용하여 \foo의 FOO 환경을 만든다. 이때 옵션 인자들은 무시한다.
2. FOO 환경을 부르는 새로운 환경을 만든다. 이때 \begin{FOO} 대신 \FOO와 \endFOO를 이용한다.

\NewEnviron{FOO}{\foo{\BODY}}

\NewDocumentEnvironment {GOO} { o d() d<> }
{
  \IfValueT{#1} {...}
  \IfValueT{#2} {...}
  \FOO
}
{ \endFOO }

당초에 환경으로 정의하지 못하는 그럴듯한 이유 가운데 하나가 인자를 미리 끝까지 읽고 어떤 전처리를 하는 것이다. 예를 들어, 인자를 hbox에 저장하고 그것의 길이를 잰다거나 나중에 사용하는 것이다.

댓글 쓰기

목록

KTUG 한국 텍 사용자 그룹