expl3의 '가짜' 변종

expl3의 '가짜' 변종

세 개의 토큰에 대해 작동하는 함수가 있다고 가정해 보겠습니다.

\cs_new:Nn \@@_on_three:NNN { #1, #2, #3 }

그리고 값이 세 개의 토큰인 변수가 있습니다.

\tl_set:Nn \l@@_three_tl { foo }

그리고 당신은 변형을 원합니다

\@@_on_three:V

당신이 말할 수 있도록

\@@_on_three:V \l@@_three_tl

그러나 내가 착각한 것이 아니라면 direct는 인수의 개수( vs. 또는 ) \cs_generate_variant가 다르기 때문에 혼동될 수 있으며 어떤 경우에도 확장된 인수를 전달합니다.NNNVx중괄호 안에, 오른쪽?

따라서 필요한 것은 다음과 같이 정의된 일종의 '가짜' 변형입니다.

\cs_new:Nn \@@_on_three:V
  { \exp_last_unbraced:Nx \@@_on_three:NNN #1 }

확실하게:이게 효과가 있어. 내 질문은 오히려 덜 '장난'스러운, 즉 덜 중간 수준의 속임수를 사용하는 또 다른 방법이 있는지 여부입니다 expl3.

답변1

정의

\cs_new:Nn \@@_on_three:V
  { \exp_last_unbraced:Nx \@@_on_three:NNN #1 }

'잘못된' 프로그래밍 지침에 따른 것입니다 expl3. -type V변형은 -type 기본 함수와 관련되어야 하며 n프로세스 중인 변수의 내용에 대해 가정을 해서는 안 됩니다. 예를 들어, 어떤 일이 발생합니까?

\tl_set:Nn \l_@@_three_tl { A }

주어진 정의로 \@@_on_three:V? 또한 x-type 확장이 아닌 V-type 확장을 수행합니다. 예를 들어 전달된 변수가 TeX 레지스터이거나 LaTeX2e '보호된' 코드와 같은 항목이 포함된 경우에는 실패합니다.

명확하게 말하면 \cs_generate_variant:Nn변형을 생성하는 데 반드시 사용해야 하는 것은 아니지만 변형이 그랬던 것처럼 동일한 방식으로 동작하는 것이 '필수'입니다. 예를 들어 수동으로 조정된 다양한 변형이 있지만 l3tl이는 성능을 향상시키기 위한 것일 뿐 동작을 변경하지는 않습니다. x이와 관련하여 올바른 결과를 보여주지 못했기 때문에 최근에 많은 -type 변형을 강화했다는 사실도 참조하세요 .

질문은 말하지 않지만 tl여기에는 항상 세 개의 토큰으로 구성되는 구조화된 데이터를 저장하는 데 사용되는 것처럼 읽혀집니다. 따라서 원하는 것은 다음과 같습니다.

\cs_new:Nn \@@_on_three:N
  { \exp_last_unbraced:No \@@_on_three:NNN #1 }

의미 체계는 정확히 3개의 토큰을 포함하는 \@@_on_three:N데 사용해야 합니다 tl. 이는 낮은 수준의 작업에서 일반적이며 유사한 코드가 예를 들어 실험 출력 루틴( xor)(수정 예정)의 일부에 사용됩니다.

관련 정보