기능을 위한 LaTeX3 인터페이스

기능을 위한 LaTeX3 인터페이스

나는 최근에 사용자가 지정한 목록의 요소를 수정하는 일반 TeX 매크로 작성에 대한 질문을 게시했습니다. 나는 TeX의 인터페이스에 대한 나의 혐오감을 노골적으로 언급했고, 그래서 누군가 나를 LaTeX3로 전환시켰습니다. LaTeX3은 설명서에 명시된 대로 현대 프로그래밍 언어에 더 가깝다고 되어 있습니다. 저는 이제 막 TeX 프로그래밍을 시작하고 있어서 매뉴얼을 이해하는 것이 힘든 싸움이었습니다. 나는 매뉴얼이 숙련된 TeX 사용자를 위해 작성되었기 때문이라고 생각합니다. 그러나 LaTeX3/TeX를 막 시작하는 사람들을 위한 대안은 없는 것 같아서 제가 가지고 있는 것을 가지고 작업할 수밖에 없습니다. 그래서 내가 이 글을 올리는 것이다. 매뉴얼은 혼란스럽습니다. 구문에 대한 몇 가지 간단한 질문을 통해 이러한 혼란을 해소하고 싶습니다.

나에게 LaTeX3에 대해 알려준 사람이 LaTeX3의 인터페이스를 사용하여 내 원래 게시물에 대한 솔루션도 제공했다는 점을 언급해야 합니다. 나는 LaTeX3 구문에 대한 몇 가지 기본 사실을 해결하기 위해 매뉴얼과 함께 이 솔루션을 사용할 수 있었습니다. 나는 내가 알아낸 것에 대해 이야기할 것입니다. 그러나 공정한 경고입니다. 그 중 일부는 설명서의 명시적인 지침이 아니라 stackexchange 사용자가 제공한 예제의 도움을 받아 그린 내 자신의 추론을 기반으로 합니다. 그러니 실수를 예상하세요. 나는 때때로 내 자신의 용어를 사용할 때 문제를 난독화하는 것이 아니라는 점을 알아주셨으면 합니다. 완전히 이해하지 못하는 주제에 대해 체계적인 방식으로 이야기하는 것은 어렵습니다.

그리고 글이 너무 길어서 댓글이 아닌 별도의 글로 작성합니다. 미리 감사드립니다.

------------------------------------- ------------------------------------- ------

기능 정의.

내가 지금까지 알아낸 것:

새로운 함수는 무엇보다도 다음 코드를 사용하여 정의됩니다.

\cs_new_<restrictions>:Npn <function name> <function parameters> {<replacement code>}

LaTeX 명령 이고 \cs_new_<restrictions>, Npn은 인터페이스의 "파서"에게 \cs_new_<restrictions>: Npn코드 부분 뒤에 무엇을 기대해야 하는지 알려주기 위해 존재합니다. 이 경우 단일 토큰 제어 단어, 즉 <function name>하나 이상의 매개변수, 즉 <function parameters>토큰 목록, 즉 {<code>}함수를 대체하는 입니다.

따라서 예를 들어 4개의 인수를 취하는 새 함수를 정의하려면 다음 코드를 사용하면 됩니다.

\cs_new_<restrictions>:Npn \myfunction #1 #2 #3 #4 {<code>}

마찬가지로 2개의 인수가 있는 함수의 코드는 다음과 같습니다.

\cs_new_<restrictions>:Npn \myfunction #1 #2 {<code>}

물론, 나는 가정하고 있습니다 - 내가 틀렸다면 정정하십시오 - 공백은 필요하지 않습니다. 왜냐하면 파서는 이미 다음의 도움으로 서로 "메타" 인수( <function name>, <parameters>, ) 를 설명하는 방법을 들었기 때문입니다. {<code>}"메타 서명"Npn.

이제 #을 없애고 싶다면 다음 일반 명령을 사용할 수 있습니다.

\cs_new_<restrictions>:Nn <function name>:<function signature> {<code>}

유사한 거래를 제외하고는 파서가 <function signature>Nn, NnN, TnN 또는 기타 다른 것을 기대한다는 점을 제외하면 <function name>.

다시 말하지만, 4개의 인수를 가진 함수는 다음과 같습니다.

\cs_new_<restrictions>:Nn \myfunction:NNNN {<code>}

그리고 이와 같은 2개의 인수가 있는 하나

\cs_new_<restrictions>:Nn \myfunction:NN {<code>}

다른 명령이 있습니다.l3기본함수를 생성하기 위한 라이브러리이지만 일반적인 구조는 본질적으로 동일한 것 같습니다. 유일한 차이점은 기능에 있습니다. 예를 들어 대신을 사용하면 함수가 전역이 아닌 로컬로 만들어집니다 \cs_set.... \cs_new...아마도 e-type과 x-type 확장이 무엇인지에 대해 더 자세한 내용을 묻는 후속 게시물을 작성할 것입니다. 하지만 지금은 큰 그림을 고수하는 것이 최선이라고 생각합니다.

어쨌든, 여기까지가 맞나요?

좋아요, 계속하세요.

변수 정의.

내가 지금까지 알아낸 것:

LaTeX3에는 꽤 많은 데이터 유형이 있지만 주요 유형은 다음과 같습니다.토큰 목록,문자열,정수,시퀀스, 그리고쉼표로 구분된 목록. 그들은 각각 자신의 약어를 사용하지만 일반적으로 새 변수를 정의할 때 유형을 선언하고 다음과 같은 키워드를 사용합니다.새로운또는const변수를 초기화하는지 여부에 따라 다릅니다.

예를 들어, 선언하고 싶지만 초기화하지는 않으려는 경우토큰 목록변수 나는 코드를 사용합니다 :

\tl_new:N \mytokenList

그런 다음 라인 아래 어딘가에 \mytokenList코드와 함께 토큰 목록을 저장할 수 있습니다.

\tl_set:Nn \mytokenList {<tokens>}

그러나 처음부터 변수에 저장하려는 데이터가 무엇인지 알고 있다면 대신 이 명령을 사용할 수 있습니다(다음에는 적용되지 않음).시퀀스또는정수)

\tl_const:Nn \mytokenList {<tokens>}

여담: 변수에도 "함수 서명"이 있다는 것을 알았습니다. 아마도 구문 분석 체제를 더 쉽게 정의할 수 있을 것입니다.

이는 내가 참조하는 데이터 유형을 지정하기 전에 가능한 한 일반적인 것입니다. 각 데이터 유형에는 자체 관련 작업이 있기 때문입니다.

------------------------------------- ------------------------------------- ------

그것이 내가 지금까지 가지고 있는 것입니다. 어떤 피드백이라도 감사하겠습니다. 이런 내용은 혼자서 배우기가 쉽지 않습니다! 특히 TeX에 대한 지식이 거의 없기 때문에 이것을 보고 "분명히"라고 생각하는 분들이 계시다면 사과드립니다. 어쨌든, 다시 한 번 감사드립니다.

답변1

함수를 정의하는 두 가지 주요 방법이 있습니다.

\cs_new<restrictions>:Npn

\cs_new<restrictions>:Nn

어디에 _protected, _nopar또는 가 있을 수 있습니까 _protected_nopar?

두 가지 방법 모두 N다음의 -argument(즉, 단일 토큰)가 현재 정의되지 않은 제어 시퀀스(또는 활성 문자)인지 확인하고전 세계적으로제어 순서를 정의합니다.

차이점이 뭐야? 첫 번째 계열에서는 제어 시퀀스를 정의한 후 {함수의 "대체 텍스트"를 구분하기 전에 "매개변수 텍스트"가 필요합니다.

"매개변수 텍스트" 는 등을 포함한 모든 토큰 시퀀스일 수 있습니다 #1. 그러나 이러한 자유의 모든 힘을 이해하려면 TeXbook의 20장과 "구분 논증"의 개념을 알아야 합니다.#2#9

그래도 간단하게 유지합시다. 다음 두 코드 부분은 완전히 동일합니다.

\cs_new:Npn \harry_foo:nn #1 #2 { -#1-#2- }
\cs_new:Nn \harry_foo:nn { -#1-#2- }

왜냐하면 후자는 #1#2정의할 함수의 시그니처를 기반으로 매개변수 텍스트를 자동으로 제공하기 때문입니다(이 경우) :nn.

n서명은 및 문자 의 (비어 있을 수도 있음) 시퀀스로 구성되어야 합니다 N.

\ExplSyntaxOn활성화 되면 공백이 무시됩니다 .

\cs_new:Npn \harry_foo:nn #1 #2 { -#1-#2- }
\cs_new:Npn \harry_foo:nn #1#2 { -#1-#2- }
\cs_new:Npn \harry_foo:nn #1#2{ -#1-#2- }

모두 동일합니다. 뒤에도 공백이 있을 수 있지만 #권장하지는 않습니다.

TeX의 구문 규칙은 "매개변수 텍스트"를 예상할 때(기본적으로 \def유사한 할당을 수행할 때 정의할 매크로 이름을 저장한 후) 를 지정합니다.모든 것첫 번째까지는 {매개변수 텍스트의 일부입니다. 매개변수 텍스트가 무엇인지 예측할 수 있는 방법이 없으므로 p"모든 것까지 {"를 의미하는 특수 인수 지정자가 필요합니다.

#1등과 같은 간단한 매개변수 텍스트만 #1#2자동으로 생성될 수 있으며, 이는 두 번째 패밀리를 사용할 때 수행됩니다 \cs_new<restrictions>:Nn.

어디가 잘못됐나요? T서명에서 지정자로 사용할 수 있다고 가정합니다 . 인수 지정자 Tor 는 수행될 F때 추가됩니다 .\prg_new_conditional<restrictions>:Nnn

또한 이전에 표시된 것처럼 매개변수 텍스트에 대한 분석이 잘못되었습니다.

\cs_set<restrictions>:Npn그리고 는 어떻습니까 :Nn? 위의 모든 내용이 적용됩니다. 단, 정의할 함수가 정의되었는지 여부를 확인하지 않고 해당 의미를 자동으로 덮어쓰지만 선언 범위는 현재 그룹과 일치합니다. 일반적 \cs_set...으로 의미가 고정되지 않도록 상황에 맞게 조정해야 하는 임시 기능에 사용됩니다.


변수 명명 규칙추천하다이름이 l, g또는 으로 시작합니다 c. 실제로 expl3코드에 사용되는 변수는 규칙을 따라야 합니다. 문서에서 사용되는 \myTokenList유형의 변수 tl(아마도 ) 와 같은 "일반적인" 이름을 사용할 수 있습니다 .clist

로 시작하는 변수는 l항상 로컬(예: )에 따라 작동해야 하고 \tl_set:Nn, 로 시작하는 변수는 g항상 전역(예: )에 따라 작동해야 합니다 \tl_gset:Nn.

로 시작하는 변수는 c다음과 같습니다.상수그리고 그래야 한다절대값이 할당된 후에 실행되었지만 사용만 되었습니다.

다음을 사용하여 상수를 정의할 수 있습니다.

\tl_const:Nn \c_harry_foo_tl {<tokens>}
\str_const:Nn \c_harry_foo_str {<tokens>}
\clist_const:Nn \c_harry_foo_clist {<comma list>}
\seq_const_from_clist:Nn \c_harry_foo_seq {<comma list>}
\prop_const_from_keyval:Nn \c_harry_foo_prop {<key-value list>}
\int_const:Nn \c_harry_foo_int {<integer expression>}
\fp_const:Nn \c_harry_foo_int {<fp expression>}
\bool_const:Nn \c_harry_foo_bool {<boolean expression>}
\dim_const:Nn \c_harry_foo_dim {<dimen expression>}
\skip_const:Nn \c_harry_foo_dim {<skip expression>}
\muskip_const:Nn \c_harry_foo_dim {<muskip expression>}
\intarray_const_from_clist:Nn \c_harry_foo_intarray {<comma list>}
\regex_const:Nn \c_harry_foo_regex {<regex>}
\cc_tab_const:Nn \c_harry_foo_cctab {<code>}

관련 정보