\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
를 피하는 방법을 배우게되며 덜 복잡한 작업에는 안전합니다.
luat-mac.lua
a에서 찾을 수 있습니다. > (문맥 용) 및 Luatex-Plain 용luatex-preprocessor.lua
. Hth.\define
를 사용하여 정의 된 매크로는 e-TeX로 보호됩니다. 확장 가능하게하려면\defineexpandable
(또는 일반\def
)를 사용해야합니다.