Текст в ExplSyntaxВкл/Выкл

Текст в ExplSyntaxВкл/Выкл

Как показано ниже, я хотел бы проверить, ввел ли пользователь какой-либо пользовательский текст, и если нет, то отобразить текст по умолчанию.

\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

Есть несколько подходов, которые можно использовать. Если это просто one-shot, где вам нужен только этот кусок текста, то что-то вроде

\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токенизирует ввод, но я оставляю текстовую часть «после», чтобы она считывалась с помощью catcodes документа.

Другой подход — просто изменить поведение , используя группировку:

\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_cctabустанавливает только коды «документа».послемакрос \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

Затем \mytextсодержит правильно отформатированный текст, не нарушенный синтаксисом кодирования LaTeX3.

Связанный контент