ExplSyntaxOn/Off 내 텍스트

ExplSyntaxOn/Off 내 텍스트

아래와 같이 사용자가 사용자 정의 텍스트를 입력했는지 테스트하고, 그렇지 않은 경우 기본 텍스트를 표시하고 싶습니다.

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l_empty_tl

\NewDocumentCommand{\dostuff}{}{
    \tl_if_empty:NTF \l_empty_tl
        {Here is a large block of default text that I would like use.}
        {\tl_use:N \l_empty_tl}
}

\ExplSyntaxOff
\begin{document}

\dostuff

\end{document}

나는 입력하지 않는 것을 선호하며 Here~is~a~large...공백을 인식하는 간단한 방법이 있는지 궁금합니다. 나는 시도했다

{\cctab_begin:N \c_document_cctab Here is a large..\cctab_end:}

소용이 없습니다. 나는 이것이 속일 수 있다고 생각하지만 관련 질문을 찾을 수 없는 것 같습니다.

답변1

사용할 수 있는 몇 가지 접근 방식이 있습니다. 해당 텍스트만 원하는 간단한 원샷이라면 다음과 같습니다.

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l_my_tl
\NewDocumentCommand { \dostuff } { }
  {
    \tl_if_empty:NTF \l_my_tl
      { \tl_use:N \c_my_tl }
      { \tl_use:N \l_my_tl }
  }
\use:n
  {
    \ExplSyntaxOff
    \tl_const:Nn \c_my_tl
  }
  {Here is a large block of default text that I would like use.}
\begin{document}

\dostuff

\end{document}

아마도 가장 쉬울 것입니다. 여기서의 아이디어는 \use:n입력을 토큰화하지만 문서 catcode로 읽을 수 있도록 텍스트 부분을 '뒤'에 남겨두는 것입니다.

또 다른 접근 방식은 그룹화를 사용하여 단순히 의 동작을 변경하는 것입니다 .

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l_my_tl
\NewDocumentCommand { \dostuff } { }
  {
    \tl_if_empty:NTF \l_my_tl
      { \tl_use:N \c_my_tl }
      { \tl_use:N \l_my_tl }
  }
\group_begin:
  \char_set_catcode_space:n {`\ }%
  \tl_const:Nn\c_my_tl{Here is a large block of default text that I would like use.}%
\group_end:
\ExplSyntaxOff
\begin{document}

\dostuff

\end{document}

또는 그렇지 않은 경우:

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l_my_tl
\NewDocumentCommand { \dostuff } { }
  {
    \tl_if_empty:NTF \l_my_tl
      { \tl_use:N \c_my_tl }
      { \tl_use:N \l_my_tl }
  }
\char_set_catcode_space:n {`\ }%
\tl_const:Nn\c_my_tl{Here is a large block of default text that I would like use.}%
\char_set_catcode_ignore:n{`\ }%
\ExplSyntaxOff
\begin{document}

\dostuff

\end{document}

(요청한 텍스트가 상수인지는 확실하지 않습니다. 그렇지 않은 경우 위의 내용을 수정하겠습니다.)

나는 강력히 추천하고 싶다~ 아니다재검색 방법을 사용합니다. 솔직히 말해서 재스캔이 문제를 해결하는 좋은 방법이라는 것을 알았습니다.극도로사용에 주의하세요.어느새로운 코드(가족을 완전히 삭제하면 아마도 행복할 것 같습니다 \tl_rescan:!).

답변2

\cctab_begin:N \c_document_cctabCatcode를 "문서" 코드로만 설정하기 때문에 작동하지 않습니다.~ 후에매크로가 \dostuff확장되었으며 텍스트 블록에 공백을 저장하기에는 이미 너무 늦었습니다. 이제 \scantokens또는 LaTeX3와 동등한 것을 사용하여 이 문제를 해결할 수 있지만 expl3구문 외부에서 생성된 매크로에 텍스트를 저장하는 것을 제안할 수도 있습니다.

\usepackage{xparse,expl3}

\NewDocumentCommand \mytext { } {%
 Here is a large...%
}

\ExplSyntaxOn
\tl_new:N \l_empty_tl

\NewDocumentCommand{\dostuff}{}{
    \tl_if_empty:NTF \l_empty_tl
        {\mytext}
        {\tl_use:N \l_empty_tl}
}

\ExplSyntaxOff

그런 다음 \mytextLaTeX3 코딩 구문에 의해 방해받지 않는 올바른 형식의 텍스트를 포함합니다.

관련 정보