Texto dentro de ExplSyntaxOn/Off

Texto dentro de ExplSyntaxOn/Off

Conforme abaixo, gostaria de testar se um usuário inseriu algum texto personalizado e, se não, exibir o texto padrão.

\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}

Prefiro não digitar Here~is~a~large...e me perguntar se existe uma maneira simples de reconhecer os espaços. eu tentei

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

para nenhum proveito. Eu sinto que isso pode ser um engano, mas não consigo encontrar uma pergunta relevante.

Responder1

Existem algumas abordagens que podem ser usadas. Se for um one-shot simples onde você quer apenas aquele pedaço de texto, então algo como

\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}

é provavelmente mais fácil. A ideia aqui é \use:ntokenizar a entrada, mas deixo a parte do texto 'depois' para que seja lida com os catcodes do documento.

Outra abordagem é simplesmente alterar o comportamento de , usando agrupamento:

\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}

ou então:

\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}

(Não está claro se o texto solicitado é uma constante: caso contrário, modificarei o texto acima.)

Eu recomendo fortementenãousando um método de nova varredura. Para ser honesto, descobri que a nova digitalização é uma boa maneira de quebrar as coisas e seriaextremamentecauteloso ao usá-lo emqualquernovo código (ao ponto em que eu provavelmente ficaria feliz se abandonássemos \tl_rescan:totalmente a família!).

Responder2

Isso não vai funcionar, porque \cctab_begin:N \c_document_cctabapenas define os catcodes para os "documentos"depoisa macro \dostuffestá expandida e já é tarde demais para salvar os espaços em seu bloco de texto. Agora, alguém poderia contornar isso usando \scantokenso equivalente em LaTeX3, mas eu poderia propor simplesmente armazenar seu texto em uma macro criada fora da expl3sintaxe, ou seja

\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

Em seguida, \mytextcontém texto formatado corretamente que não é perturbado pela sintaxe de codificação do LaTeX3.

informação relacionada