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:n
die 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_cctab
nur die Catcodes auf die "Dokument"-Codes gesetzt werden.nachdas Makro \dostuff
wird 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 \scantokens
erstellt 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 \mytext
enthält es korrekt formatierten Text, der nicht durch die LaTeX3-Codierungssyntax gestört wird.