Texto dentro de ExplSyntaxOn/Off

Texto dentro de ExplSyntaxOn/Off

Como se muestra a continuación, me gustaría probar si un usuario ha ingresado algún texto personalizado y, de no ser así, mostrar el texto predeterminado.

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

Preferiría no escribir Here~is~a~large...y preguntarme si existe una forma sencilla de reconocer los espacios. Yo he tratado

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

en vano. Siento que esto podría ser un engaño, pero parece que no puedo encontrar una pregunta relevante.

Respuesta1

Hay algunos enfoques que se podrían utilizar. Si se trata de un one-shot simple en el que solo quieres ese fragmento de texto, entonces 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}

Probablemente sea lo más fácil. La idea aquí es \use:ntokenizar la entrada, pero dejo la parte de texto 'después' para que se lea con códigos cat del documento.

Otro enfoque es simplemente alterar el comportamiento de , ya sea mediante agrupación:

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

o de otro modo:

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

(No está claro si el texto solicitado es una constante: si no, modificaré lo anterior).

Lo recomiendo fuertementenousando un método de reexploración. Para ser honesto, he descubierto que volver a escanear es una buena manera de romper cosas y seríaextremadamentecauteloso al usarlo encualquiernuevo código (¡hasta el punto en que probablemente sería feliz si dejáramos a la \tl_rescan:familia por completo!).

Respuesta2

Eso no funcionará, porque \cctab_begin:N \c_document_cctabsolo establece los códigos cat en los de "documento".despuésla macro \dostuffse expande y ya es demasiado tarde para guardar los espacios en su bloque de texto. Ahora, uno podría solucionar esto usando \scantokensel equivalente de LaTeX3, pero podría proponer simplemente almacenar su texto en una macro que se crea fuera de la expl3sintaxis, es decir

\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

Luego \mytextcontiene texto con el formato correcto que no se ve afectado por la sintaxis de codificación LaTeX3.

información relacionada