Как показано ниже, я хотел бы проверить, ввел ли пользователь какой-либо пользовательский текст, и если нет, то отобразить текст по умолчанию.
\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.