2009-12-08 4 views
4

나는 새로운 값을위한 매개 변수를 테스트하기 위해 '도우미'매크로를 쓰려고 노력했다. 그렇지 않으면 기존 값을 사용했다. 모든 매개 변수 위치에 기본값이 존재한다. TeX edef 매크로 블루스

나는 쓸 수 있기를 원 :

\foo{left}{nil}{}{20pt} 

두 번째 매개 변수는 현재 값을 사용하는 것이지만, 세 번째 값이 값이 빈 문자열이 될 수 있도록.

\edef\pA{\isnil{#1}{\pA){#1}} % one for each parameter 

내가 \ isnil과 같이 정의 : 나는 표기법 사용하고 싶었

\def\nil{nil} 
\def\isnil#1#2#3{% 
    \edef\nilTest{#1}% 
    \ifx\nilTest\nil#2\else#3\fi 
} 

을하지만 난 그것을 실행하려고 할 때, TeX은 \ nilTest 정의되지 않은 제어 시퀀스라고 불평했다. 물론 그렇습니다. 그러나 \ pA에 값을 저장하는 것이 아니라 값을 저장하는 것이므로 \ edef 여야합니다. 즉 모든 매크로 테스트가 확장되지만 \ edef는 \ nilTest - 이것은 \ noexpand를 사용하는 장소입니다 - 저에게는 효과가없는 것 같습니다.

편집 : \ CS 이름에는 숫자 (예, 나는 그것을 알지 못했다.)

답변

3

왜 솔루션 작동하지 않습니다? \edef\pA{\isnil{#1}{\pA){#1}}\isnil으로 확장되고 \edef\nilTest{...이됩니다. 이제 \edef은 확장 할 수 없으며 첫 번째 요소로 \ pA의 시퀀스에 속합니다. 다음 매크로 확장 시도가 실패합니다. \nilTest.

다음 코드에서 \setpar을 사용하여 매개 변수를 변경하십시오.

\def\nil{nil} 
\def\setpar#1#2{% 
    \edef\nilTest{#2}% 
    \ifx\nilTest\nil\else\let#1\nilTest\fi} 

\def\first{old first} 
\def\second{old second} 
\setpar \first{nil} 
\setpar \second{new} 

first = ``\first'', second = ``\second'' 

P. 매크로에 숫자를 사용하지 마십시오.