expl3에서 두 번 확장하는 데 선호되는 방법은 무엇입니까?

expl3에서 두 번 확장하는 데 선호되는 방법은 무엇입니까?

expl3기본 함수에 인수를 전달하기 전에 각각 한 수준 및 두 가지 종류의 완전 확장에 대한 인수 지정자를 포함 o합니다 . 주장을 확장하는 데 선호되는 방법은 무엇입니까?fx두 배기본 함수에 전달하기 전에?

예를 들어, 패키지 에서 l3keys생성된 매크로에 대한 키-값 인터페이스를 작성하려고 합니다 .\DeclarePairedDelimitermathtools

\tl_new:N \l__mymodule_size_tl
\keys_define:nn { mymodule }
  {
    size .choices:nn =
      { big , Big , bigg , Bigg }
      {
        \tl_set:Nn \l__mymodule_size_tl
          { [ \use:c { \tl_use:N \l_keys_choice_tl } ] }
      } ,

    size / auto .code:n = 
      \tl_set:Nn \l__mymodule_size_tl {*} ,

    size / none .code:n = 
      \tl_clear:N \l__mymodule_size_tl
  }

일반적으로 구분 기호의 크기는 where 와 같은 \bigetc. 또는 의 선택적 인수로 매크로에 전달됩니다 . 나는 등을 갖 거나 .*\abs[\big]{x}\DeclarePairedDelimiter\abs{\lvert}{\rvert}size = bigsize = auto\myabs[size=big]{x}

위 코드의 문제는 등의 선택 항목을 올바르게 설정하는 데 있습니다 \l__mymodule_size_tl. big확장해야 합니다.[ \use:c { \tl_use:N \l_keys_choice_tl } ] 두 배해당 토큰을 \l__mymodule_size_tl.

  • 확장을 사용하지 않는 경우(예: \tl_set:Nn) 호출은 \abs인수를 잘못된 형식으로 가져오며 가 아닌 을 \l__mymodule_size_tl유지합니다 .[ \use:c { \tl_use:N \l_keys_choice_tl } ][\big]
  • \tl_set:No한 수준 확장(예: ) 을 사용 하고 [확장이 완료된 후 앞에 추가하면 가 아닌 을 \l__mymodule_size_tl유지합니다 .[ \cs:w \tl_use:N \l_keys_choice_tl \cs_end: ][\big]
  • 또는 확장 중 하나를 사용하면 f가 아닌 "쓰레기"가 많이 발생합니다 .x\l__mymodule_size_tl[\big]

어떡해? 아이디어는 다음과 같습니다. 두 가지 o확장팩을 사용하고 그 사이에 곡예를 추가하세요.

    \tl_set:No \l__mymodule_size_tl
      { \use:c { \tl_use:N \l_keys_choice_tl } ] }
    \exp_args:NNV \tl_set:No \l__mymodule_size_tl 
      \l__mymodule_size_tl
    \tl_put_left:Nn \l__mymodule_size_tl { [ }

제 생각에는 이것은 다소 추악한 것 같습니다. 내가 할 수 있는 더 좋은 일이 없을까?

답변1

옛날에는 d이중 확장에 대한 -type 논쟁이 있었습니다. 그러나 특히 팀이 toks일반적으로 레지스터를 사용하지 않기로 결정했을 때 필요한 장소가 거의 없었기 때문에 몇 년 전에 삭제되었습니다. 기억에 따르면 expl3우리가 이와 유사한 형태의 구성을 사용해야 했던 곳이 두 군데 있습니다 \exp_args:NNo \exp_args:No.

-type 인수를 유지하지 않은 이유 d는 두 가지입니다. 첫째, 우리는 가능한 한 기능의 확장 세부 사항을 아는 것에 의존하는 것을 피하고 싶습니다. 이는 낮은 수준의 작업에 필요하지만 이상적으로는 상대적으로 제한되어야 합니다. 또 다른 이유는 e-TeX를 사용할 수 있기 때문에 거의 필요하지 않기 때문입니다. 기억해야 할 핵심은 이를 통해 x-type 컨텍스트 에서 확장을 제어할 수 있다는 것입니다.

\tl_set:Nx \l__mymodule_size_tl
  { [ \exp_not:c { \tl_use:N \l_keys_choice_tl } ] }

여기서는 필요하지 않지만 정확히 하나의 확장이 필요한 상황에 대해 \cs:w문서화 합니다.\cs_end:

\tl_set:No \l__mymodule_size_tl
  { \exp_after:wN [ \cs:w \tl_use:N \l_keys_choice_tl \cs_end: ] }

하지만 나는 여기서 그것을 직접 사용하지 않을 것입니다.

답변2

내 인상은 당신이하고 싶어한다는 것입니다

\tl_set:Nx \l__mymodule_size_tl
 {
  [ \exp_not:c { \tl_use:N \l_keys_choice_tl } ]
 }

x확장이 트리거 되면 인수가 관련될 \exp_not:c때 항상 그렇듯이 완전히 확장됩니다 . 그러면 결과 토큰은 확장할 수 없게 됩니다.c\csname...\endcsname

size=big

[\big]토큰 목록에 들어갈 것입니다 .

관련 정보