Wie testet man in expl3, ob etwas, sobald es vollständig erweitert ist, ein Zeichen der Klasse 11 oder 12 enthält?

Wie testet man in expl3, ob etwas, sobald es vollständig erweitert ist, ein Zeichen der Klasse 11 oder 12 enthält?

Ich frage mich, in expl3der 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 \qquadzu erweitert wird \hskip 2em\relaxund 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.

verwandte Informationen