expl3
기본 함수에 인수를 전달하기 전에 각각 한 수준 및 두 가지 종류의 완전 확장에 대한 인수 지정자를 포함 o
합니다 . 주장을 확장하는 데 선호되는 방법은 무엇입니까?f
x
두 배기본 함수에 전달하기 전에?
예를 들어, 패키지 에서 l3keys
생성된 매크로에 대한 키-값 인터페이스를 작성하려고 합니다 .\DeclarePairedDelimiter
mathtools
\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 와 같은 \big
etc. 또는 의 선택적 인수로 매크로에 전달됩니다 . 나는 등을 갖 거나 .*
\abs[\big]{x}
\DeclarePairedDelimiter\abs{\lvert}{\rvert}
size = big
size = 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]
토큰 목록에 들어갈 것입니다 .