ExplSyntaxOn/Off 内的文本

ExplSyntaxOn/Off 内的文本

如下所示,我想测试用户是否输入了一些自定义文本,如果没有,则显示默认文本。

\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

有几种方法可以使用。如果是简单的一次性操作,你只需要那段文字,那么可以这样做

\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只将 catcode 设置为“文档”\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 编码语法的干扰。

相关内容