ConTeXt에서 \ def와 \ define이 동일합니까?

\def를 사용하여 변수를 정의하는 것과 \define, 대괄호 안에 숫자없이 사용되는 경우, 예 : \def\somecommand{\percent}\define\somecommand{\percent}? \def를 사용할 수있는 장소에서 항상 \define를 사용할 수 있나요?

댓글

  • 내가 보는 바와 같이 \define\xyz{...}\xyz가 이미 정의되어있을 때 경고를 발행하지만 정의를 수행합니다. 어쨌든. 물론 \def는 ' 경고를 발행하지 않습니다.

답변

h2>

참고 : \define에는 두 가지 정의가 있습니다. syst-aux.mkiv 의 첫 번째 정의 Egreg가 주석에서 언급 한 동작을 보여줍니다. 매크로가 이미 정의되어 있으면 그대로 둡니다. (함께 제공되는 \redefine를 사용하면 사용중인 매크로에 관계없이 현재 매크로 정의를 덮어 쓸 수 있습니다.) 아이러니하게도이 예비 정의는 형식이로드되는 즉시 메모없이 덮어 쓰여집니다. core-sys.mkiv (\redefine는 영원히 머무르는 동안)

실제 사용자 인터페이스에서 제공하는 \define 매크로의 정의 는 이전에 정의 된 동일한 이름의 제어 시퀀스를 검사 할뿐만 아니라 일종의 짧은 표기법으로도 사용됩니다. 필수 인수. 스키마는

\define [<digit>] <macro> {<definition>} 

여기서 첫 번째 인수 인 숫자는 새 매크로가 허용 할 인수의 수를 지정합니다. 분명히 이것은 더 짧은 정의를 초래할 수 있습니다. 비교를 위해 선택기는

\def\sevenofnine#1#2#3#4#5#6#7#8#9{#7} \starttext \sevenofnine abcdefghi\par \stoptext 

\define 매크로를 사용하여 입력을 줄여야합니다.

\define[9]\sevenofnine{#7} 

따라서 이러한 정의는 더 읽기 쉬운 코드를 생성 할 수 있습니다. 이는 TEX를 작성할 때 항상 좋은 일입니다.

불행히도 \define 래퍼는 일반 \def의 표현력을 상당 부분 제거합니다. 문맥 상, 선택적 인수 를 사용하는 매크로는 사용자 인터페이스와 관련하여 일반적입니다. 예를 들어 아래 스 니펫의 두 번째 \def inition을 \define를 사용하는 동등한 표현식으로 대체 할 수 없습니다.

\unprotect \def\myfoo{\dosingleempty\do_my_foo} \def\do_my_foo[#1]#2{% \iffirstargument{\bf\WORD#1}\fi #2\par% } \protect \starttext \myfoo{bar} \myfoo[foo]{bar} \stoptext 

그 이유는 \define를 사용하면 필요한 인수 구분 기호 (여기서는 대괄호)를 지정할 수 없기 때문입니다. 선택적 인수이므로 기본적으로 매크로는 필수 (중괄호) 인수 만 사용하도록 제한됩니다. 같은 이유로 저렴한 \{start|stop}something 환경을 정의 할 방법이 없습니다.

\let\stopfoo\relax \def\startfoo#1\stopfoo{\bgroup\bold#1\egroup} %%% ^^^^^^^^ not possible \starttext \startfoo bar \stopfoo \stoptext 

( 어쨌든 이것은 \definestartstop (cf. core-sys.mkiv )입니다.)

마지막으로 오늘날 \define mkvi 스타일 인수를 허용하지 않습니다. 처음에 매개 변수를 지정할 수없는 경우 매개 변수를 이름 으로 참조 할 수있는 방법이 없습니다.

% macros=mkvi \unprotect \def\foo{\dosingleempty\do_foo} \def\do_foo[#optional]#mandatory{% \bgroup\sansbold#optional\space\egroup #mandatory\par% } \protect \starttext \foo{bar} \foo[foo]{bar} \stoptext 

따라서 심각한 매크로 작성을하고 싶다면 곧 \define를 피하는 방법을 배우게되며 덜 복잡한 작업에는 안전합니다.

댓글

  • 유용한 답변에 감사드립니다. 설명 : " mkiv 스타일 인수 "라고 말하면 귀하의 예에서? 이것에 대해 더 자세히 읽을 수있는 참조가 있습니까?
  • @LarsH 예, Mk VI (MkIV가 아닙니다!) 매크로는 (선택 사항) 매개 변수 이름을 가진 매크로입니다. 소스 외에 사용자 수준 문서가 있는지 잘 모르겠습니다. 전 처리기 코드는 luat-mac.lua (문맥 용) 및 Luatex-Plain 용 luatex-preprocessor.lua . Hth.
  • 죄송합니다. 실수입니다.
  • 이 답변을 작성하는 시점에 이것이 사실 이었는지 ' 알 수 없지만 오늘 \define를 사용하여 정의 된 매크로는 e-TeX로 보호됩니다. 확장 가능하게하려면 \defineexpandable (또는 일반 \def)를 사용해야합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다