
構文的に疑問に思っているのですexpl3
が(最新の追加ではなく、2018年以降の追加としましょう[2018年については特別なことはなく、単に任意の日付を言うだけですあまり最近ではない]) 何かが完全に拡張されると含むクラス11または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}
を使用すると\tl_if_blank:nTF
動作しません:
\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}
答え1
中括弧グループをトップレベルでのみ扱うことができ、それが{E}
と同等であると仮定するとE
、次のように実行できる。
\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
ブレースの取り扱いを改良することは可能ですが、この質問ではこの領域における期待が明確に定義されていません。
問題はさらに複雑になり、 のような式\qquad
は に展開され\hskip 2em\relax
、catcode-11および12トークンを含む。このようなケースは次のようにカバーできると仮定すると、
\usepackage{etoolbox}
\robustify\qquad
その後、提案されたコードを使用して目的の出力を取得できます。