Text innerhalb von ExplSyntaxEin/Aus

Text innerhalb von ExplSyntaxEin/Aus

Wie unten möchte ich testen, ob ein Benutzer benutzerdefinierten Text eingegeben hat, und wenn nicht, dann den Standardtext anzeigen.

\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}

Ich möchte lieber nicht tippen Here~is~a~large...und frage mich, ob es eine einfache Möglichkeit gibt, die Leerzeichen erkennen zu lassen. Ich habe versucht

{\cctab_begin:N \c_document_cctab Here is a large..\cctab_end:}

ohne Erfolg. Ich habe das Gefühl, dass es sich hier um einen Betrug handeln könnte, kann aber keine relevante Frage finden.

Antwort1

Es gibt ein paar Ansätze, die man verwenden könnte. Wenn es sich um einen einfachen One-Shot handelt, bei dem Sie nur diesen Textabschnitt benötigen, dann etwas wie

\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}

ist wahrscheinlich am einfachsten. Die Idee hier ist, dass \use:ndie Eingabe tokenisiert wird, aber ich lasse den Textteil „danach“ stehen, damit er mit Dokument-Catcodes gelesen wird.

Ein anderer Ansatz besteht darin, einfach das Verhalten von zu ändern , entweder durch Gruppierung:

\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}

oder andernfalls:

\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}

(Es ist nicht klar, ob der angeforderte Text eine Konstante ist. Wenn nicht, werde ich das Obige ändern.)

Ich würde es wärmstens empfehlennichtmit einer Rescan-Methode. Ehrlich gesagt habe ich festgestellt, dass Rescan eine gute Möglichkeit ist, Dinge zu zerstören, und es wäreäußerstvorsichtig bei der Verwendung inbeliebigneuer Code (bis zu dem Punkt, an dem ich wahrscheinlich froh wäre, wenn wir die \tl_rescan:Familie ganz aufgeben würden!).

Antwort2

Das funktioniert nicht, weil \cctab_begin:N \c_document_cctabnur die Catcodes auf die "Dokument"-Codes gesetzt werden.nachdas Makro \dostuffwird erweitert, und das ist schon viel zu spät, um die Leerzeichen in Ihrem Textblock zu speichern. Nun könnte man dies umgehen, indem man oder das LaTeX3-Äquivalent verwendet , aber ich würde vorschlagen, Ihren Text einfach in einem Makro zu speichern, das außerhalb der Syntax \scantokenserstellt wird , d. h.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

Dann \mytextenthält es korrekt formatierten Text, der nicht durch die LaTeX3-Codierungssyntax gestört wird.

verwandte Informationen