
Ich frage mich, in expl3
der Syntax (ohne die neuesten Ergänzungen zu verwenden, sagen wir Ergänzungen nach 2018 [nichts Besonderes an 2018, es ist nur ein beliebiges Datum, um zu sagennicht zu neu]) wie testet man, ob etwaseinmal vollständig erweitertenthältjedes Zeichen der Klasse 11 oder 12?
\documentclass[preview = true, varwidth = true]{standalone}
\usepackage{xparse}
\NewExpandableDocumentCommand{\mytest}{m m m}{
% CODE HERE
}
\newcommand{\myempty}{}
\newcommand{\mywhitespace}{ }
\newcommand{\myquad}{\qquad}
\newcommand{\myrelax}{\relax}
\newcommand{\mystring}{ x }
\begin{document}
\begin{tabular}{c}
\mytest{\myempty}{true}{false} \\ % false
\mytest{\mywhitespace}{true}{false} \\ % false
\mytest{\myquad}{true}{false} \\ % false
\mytest{\myrelax}{true}{false} \\ % false
\mytest{\mystring}{true}{false} \\ % true
\end{tabular}
\end{document}
Wenn ich verwende \tl_if_blank:nTF
, funktioniert es nicht:
\documentclass[preview = true, varwidth = true]{standalone}
\usepackage{xparse}
\ExplSyntaxOn
\cs_generate_variant:Nn \tl_if_blank:nTF{eTF}
\NewExpandableDocumentCommand{\mytest}{m m m}{\tl_if_blank:eTF{#1}{#3}{#2}}
\ExplSyntaxOff
\newcommand{\myempty}{}
\newcommand{\mywhitespace}{ }
\newcommand{\myquad}{\qquad}
\newcommand{\myrelax}{\relax}
\newcommand{\mystring}{ x }
\begin{document}
\begin{tabular}{c}
\mytest{\myempty}{true}{false} \\ % false: OK
\mytest{\mywhitespace}{true}{false} \\ % false: OK
\mytest{\myquad}{true}{false} \\ % true: PROBLEM
\mytest{\myrelax}{true}{false} \\ % true: PROBLEM
\mytest{\mystring}{true}{false} \\ % true: OK
\end{tabular}
\end{document}
Antwort1
Angenommen, wir können Klammergruppen nur auf der obersten Ebene behandeln und das {E}
ist gleichwertig mit E
, dann können wir tun
\ExplSyntaxOn
\prg_new_conditional:Npnn \vincent_if_blank:n #1 { p , T , F , TF }
{ \exp_args:Ne \__vincent_if_blank:n {#1} }
\cs_new:Npn \__vincent_if_blank:n #1
{
\tl_if_blank:nTF {#1}
{ \prg_return_true: }
{
\tl_map_function:nN {#1} \__vincent_if_blank_aux:n
\prg_return_true:
}
}
\cs_new:Npn \__vincent_if_blank_aux:n #1
{
\tl_if_single_token:nTF {#1}
{
\bool_lazy_or:nnT
{ \token_if_letter_p:N #1 }
{ \token_if_other_p:N #1 }
{ \tl_map_break:n { \use_i:nn \prg_return_false: } }
}
{ \tl_map_break:n { \use_i:nn \prg_return_false: } }
}
\NewExpandableDocumentCommand{\mytest}{m m m}{\vincent_if_blank:nTF{#1}{#3}{#2}}
\ExplSyntaxOff
Eine Verfeinerung des Klammerhandlings ist möglich, die Frage definiert die Erwartungen in diesem Bereich jedoch nicht klar.
Das Problem wird noch komplizierter, wenn etwas wie \qquad
zu erweitert wird \hskip 2em\relax
und das dann Catcode-11 und 12 Token enthält. Wenn wir davon ausgehen, dass solche Fälle abgedeckt werden können durch
\usepackage{etoolbox}
\robustify\qquad
Anschließend können wir mit dem vorgeschlagenen Code fortfahren, um die gewünschten Ausgaben zu erhalten.