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

これは動作しません。catcodes\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

次に、\mytextLaTeX3 コーディング構文によって乱されない、正しくフォーマットされたテキストが含まれます。

関連情報