如下所示,我想测试用户是否输入了一些自定义文本,如果没有,则显示默认文本。
\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 编码语法的干扰。