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:n
tokenizar 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_cctab
apenas define os catcodes para os "documentos"depoisa macro \dostuff
está expandida e já é tarde demais para salvar os espaços em seu bloco de texto. Agora, alguém poderia contornar isso usando \scantokens
o equivalente em LaTeX3, mas eu poderia propor simplesmente armazenar seu texto em uma macro criada fora da expl3
sintaxe, 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, \mytext
contém texto formatado corretamente que não é perturbado pela sintaxe de codificação do LaTeX3.