
expl3 프로그래밍 환경에서 제공하는 많은 기능이 인터페이스3.pdf에 검은색 별표(완전 확장 가능) 또는 흰색 별표(제한된 확장 가능)로 표시되어 있습니다.
결과를 얻는 데 필요한 확장 정도에 대한 공식적인 정보를 제공하지 않고 그렇게 많은 기능이 완전히 확장 가능하다고 표시되는 이유는 무엇입니까?
\exp:w
글쎄, / 와 같은 확장 제어 수단이 \exp_end:
구현에 적용되지 않는 완전히 확장 가능한 꼬리 재귀의 경우 재귀의 양과 결과를 얻는 데 필요한 확장의 양은 사용자가 제공한 인수에 따라 달라집니다. 따라서 결과를 얻는 데 필요한 확장 정도에 대한 정확한 정보를 제공할 수 없습니다.
그러나 그렇지 않은 경우와 결과를 얻는 데 필요한 확장 정도에 대한 정확한 정보가 제공될 수 있는 함수가 많이 있습니다.
완전히 확장 가능한 expl3 함수를 사용하여 확장 컨텍스트에서 결과가 나오는 순간을 어떻게 확실히 알 수 있습니까?
예를 들어, 의 결과를 얻기 위해 트리거되어야 하는 확장의 양을 알고 싶습니다 \str_tail:n
.
x
확장 컨텍스트에서는 -expansion 자체가 확장 가능하지 않으므로 사용할 수 없습니다 . -expansion을 사용하면 문자열에서 다른 선행 공백이 제거될 수 있으므로
안전하게 사용할 수 없습니다 . 문제의 완전히 확장 가능한 함수가 인수 자체가 확장할 수 없는 명시적 문자 토큰의 문자열이 아닌 경우, -expansion은 원하는 것보다 더 많은 확장을 트리거할 수 있습니다. 게다가 -primitive를 사용할 수 없는 엔진에서는 -expansion이 비용이 많이 듭니다.f
\str_tail:n
e
\expanded
e
\str_tail:n
source3.pdf를 조사하여 현재 구현에 네 가지 확장이 필요하다는 아이디어를 얻을 수 있는 경우 :
\cs_new:Npn \str_tail:n #1
{
\exp_after:wN \__str_tail_auxi:w
\reverse_if:N \if_charcode:w
\scan_stop: \tl_to_str:n {#1} X X \s__str_stop
}
\cs_new:Npn \__str_tail_auxi:w #1 X #2 \s__str_stop { \fi: #1 }
확장 1에서는 \str_tail:n
.
확장 2는 -test \exp_after:wN
의 결과가 \if_charcode:w
평가될 때 끝나는 -thingie를 수행하므로 문자열의 첫 번째 토큰은 해당 카테고리 코드를 의 카테고리 코드와 비교하기 위한 인수로 사용됩니다 \scan_stop:
.
확장 3 은 일치를 위해 앞에 \__str_tail_auxi:w
추가 하고 카테고리 11- 구분 인수를 유지하고 -구분 인수를 제거하는 확장입니다. 확장팩 4에서는 .\fi:
\if_charcode:w
X
\s__str_stop
\fi:
그러나 source3.pdf를 조사하는 것은 구현의 공식적인 세부 사항에 대한 정보를 얻는 방법이 아닙니다.
내부 구현이 변경되는 경우 결과를 얻는 데 필요한 확장의 양도 \str_tail:n
변경될 수 있습니다.
함수 결과 이후의 확장 양을 아는 것 외에 해당 함수의 결과를 형성하는 토큰을 다른 토큰으로 둘러싸는 적절한 순간을 얻을 수 있도록 완전히 확장 가능한 기능을 갖춘 일반적인 방법은 보이지 않습니다. 거기 있어요. 해당 함수의 결과가 나올 때까지 expl3 프로그래밍 환경에서 제공하는 완전히 확장 가능한 함수의 확장을 트리거하는 데
사용할 때 확장을 중지하기 위한 적절한 순간에 수행되도록 하는 \exp:w
일반적인 방법이 표시되지 않습니다. 해당 함수의 결과가 나온 이후의 확장 양을 알지 못한 채 수행할 수 있습니다.\exp_end:
\exp:w
따라서 완전히 확장 가능한 기능을 갖춘 이 정보는 공식적인 정보로 제공되어야 한다고 생각합니다.
기능 결과까지 얼마나 많은 확장이 필요 \exp_args:...
합니까 \use_i:nn
?
해당 정보는 인터페이스3.pdf에 공식적으로 제공되지 않습니다. 예를 들어 공식적으로 문서화된 사실에만 의존하는 대신 내부 구현 세부 사항에서 정보를 추론하기 때문에 누군가 징징거리는 일 없이 항상 정확히 하나의 확장을 요구하는
것에 안전하게 의존할 수 있습니까 ? 공식적으로 문서화되지 않은 측면에서 expl3 릴리스 간의 일관성에 의존하게 되는 원인은 무엇입니까? (내 Linux 배포판과 함께 제공되는 LaTeX 배포판은 TeX Live 2024와 많이 다릅니다...)\use_i:nn
답변1
문서 상황은 의도적으로 설계된 것입니다. 확장 횟수가 중요하고 팀이나 다른 사람들이 이를 알고 의존해야 하는 (낮은 수준) 기능은 거의 없습니다. 이러한 기능은 문서화되어 있습니다. 다른 경우에는 일반적으로 e
- 또는 f
-type 확장을 사용하는 것으로 충분합니다. 예를 들어,\str_tail:n
필연적으로문자열을 생성합니다. 따라서 e
-type 컨텍스트에서는 안전합니다.필요 없음얼마나 많은 확장이 필요한지 문서화합니다.
보다 일반적으로, 함수가 다음을 수행하면문서토큰을 사용하면 -type 확장을 사용할 수 없지만 e
일반적으로 \protected@edef
LaTeX2e 강력한 명령과 함께 작동하므로 expl3
일반적으로 이를 수행하지 않습니다. 외부 텍스트의 경우 \text_expand:n
유사한 작업을 수행 \protected@edef
하지만 비텍스트 확장에서는 잘 작동하지 않습니다. 어느 쪽이든 이러한 접근 방식을 사용하면 expl3
LaTeX2e 깨지기 쉬운 재료(예: \textbf
또는 유사한 재료)를 보존하면서 기능을 확장할 수 있습니다.
필요한 확장 수를 문서화하면 코드 변경에 대한 제한이 적용됩니다. 가능한 한 이를 수행하지 않습니다. 제한은 API의 일부를 구성하는 제한일 뿐입니다. 그러한 API 안정성이 필요한 것으로 보이는 명확한 사용 사례가 있는 경우 문제를 기록하고 (문서) 변경을 요청하세요.