假设我想测试一个\ifSomething
由可能加载也可能不加载的包定义的条件。我知道如何在纯 LaTeX 中执行此操作,但我想定义一个 expl3 条件来执行相同的工作。我该怎么做呢?
MWE 通过bidi
包及其\if@RTL
条件来说明该案例。
% !TeX program = xelatex
\documentclass{article}
\usepackage{xparse}
\usepackage{bidi}
\makeatletter
% traditional method
\newcommand{\TestRTL}{%
\@ifundefined{if@RTL}{NO BIDI}%
{%
\if@RTL%
YES%
\else
NO%
\fi%
}%
}
\ExplSyntaxOn
% non-working first attempt
\prg_new_conditional:Nnn \stdt_if_rtl: {p,T,F,TF}
{
\bool_lazy_and:nnTF {\bool_if_exist_p:N \if@RTL} {\bool_if_p:N \if@RTL}
{ \prg_return_true: }
{ \prg_return_false: }
}
\NewDocumentCommand{\TestRTLAlt}{}{
\stdt_if_rtl:TF {YES} {NO}
}
\ExplSyntaxOff
\makeatother
\begin{document}
\TestRTL % \TestRTLAlt
\begin{RTL}
\TestRTL % \TestRTLAlt
\end{RTL}
\end{document}
答案1
经过一些实验后,这似乎起了作用。
% !TeX program = xelatex
\documentclass{article}
\usepackage{xparse}
\usepackage{bidi}
\makeatletter
\ExplSyntaxOn
\prg_new_conditional:Nnn \stdt_if_rtl: {p,T,F,TF}
{
\bool_lazy_and:nnTF {\bool_if_exist_p:N \@RTLtrue} {\cs_if_eq_p:NN \if@RTL \iftrue}
{ \prg_return_true: }
{ \prg_return_false: }
}
\NewDocumentCommand{\TestRTLAlt}{}{
\stdt_if_rtl:TF {YES~IT~IS} {NO~IT~ISN'T}
}
\ExplSyntaxOff
\makeatother
\begin{document}
\TestRTLAlt
\begin{RTL}
\TestRTLAlt
\end{RTL}
\end{document}