l3keys의 중괄호

l3keys의 중괄호

대부분의 경우, 키를 정의할 때 키 값을 둘러싸는 중괄호는 l3keys키 자체에 n-, c- 또는 e-type 인수가 있는 경우에도 생략되며 일반적으로 중괄호 인수가 필요합니다. 이는 중괄호를 제공하는 것보다 일관성이 없고 더 혼란스럽지 않습니까?

내 질문: (1) 중괄호가 때때로 생략되는 이유는 무엇입니까? (2) 에서 프로그래밍하는 가장 좋은 방법은 무엇입니까 expl3?

l3keys내 MWE는 중괄호 값을 사용하지 않고 키를 정의하는 간단한 데모입니다 . 주석 처리된 코드에서 키는 중괄호 값으로 정의됩니다.

\documentclass{article}

\ExplSyntaxOn

\keys_define:nn { my }
  {
    string .str_set:c = l__my_tmpa_str , % note the 'c'-type argument
    string .initial:n = initial ,
    string .value_required:n = true ,
    stringadd .code:n = \str_put_right:Nn \l__my_tmpa_str { foo } ,
    stringadd .value_forbidden:n = true ,
    stringadde .code:n = \str_put_right:Ne \l__my_tmpa_str {#1} ,
    stringadde .value_required:n = true
  }
% \keys_define:nn { my }
%   {
%     string .str_set:c = { l__my_tmpa_str } ,
%     string .initial:n = { initial } ,
%     string .value_required:n = { true } ,
%     stringadd .code:n = { \str_put_right:Nn \l__my_tmpa_str { foo } } ,
%     stringadd .value_forbidden:n = { true } , 
%     stringadde .code:n = { \str_put_right:Ne \l__my_tmpa_str {#1} } ,
%     stringadde .value_required:n = { true }
%   }

\ExplSyntaxOff

\begin{document}

\ExplSyntaxOn

\str_use:N \l__my_tmpa_str
\par
\keys_set:nn { my }
  {
    string = blah
  }
\str_use:N \l__my_tmpa_str
\par
\keys_set:nn { my }
  {
    stringadd
  }
\str_use:N \l__my_tmpa_str
\par
\tl_set:Nn \l_tmpa_tl { blah!!! }
\keys_set:nn { my }
  {
    stringadde = \l_tmpa_tl
  }
\str_use:N \l__my_tmpa_str
\par
\keys_set:nn { my } { stringadd }
\str_use:N \l__my_tmpa_str
\ExplSyntaxOff

\end{document}

답변1

-lists interface3내에서 유효한 입력이 무엇인지 정의하는 문서가 있습니다 (하위 섹션 27.10 참조). key=value여기서 모든 내용을 반복하고 싶지는 않지만 다음과 같이 요약됩니다.

중괄호는 선택 사항이며 중첩된 중괄호 외부에 있는 경우를 제외하고는 차이가 없습니다.

  • 값에 쉼표가 포함됩니다
  • 값에 하나 이상의 등호가 포함되어 있습니다.
  • 값의 양쪽 끝에 공백이 하나 이상 있습니다.

위의 사항 중 어느 것도 사실이 아닌 경우 중괄호는 완전히 선택 사항입니다(그리고 실제로 TeX가 더 적은 토큰을 이동해야 하기 때문에 생략하면 더 나은 성능을 얻을 수 있습니다).

따라서 "모범 사례"란 무엇입니까? 읽고 유지 관리하기가 더 쉽다고 생각하는 모든 것, 그리고 불필요한 중괄호 세트를 모두 생략하여 속도를 약간 향상시키고자 하는 경우입니다. 그러나 사용자 입력을 전달하자마자 공백/쉼표/등호 기호가 포함될지 여부를 알 수 없으므로 이 경우 반드시 중괄호를 사용해야 합니다.

관련 정보