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輸入進行標記,但我將文字部分保留在“之後”,以便使用文件目錄程式碼讀取它。

另一種方法是簡單地改變 的行為,或使用分組:

\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已展開,但已經太晚了,無法儲存文字區塊中的空格。現在,可以使用\scantokensLaTeX3 或等效的 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 編碼語法幹擾的格式正確的文字。

相關內容