如何使其\foo_bar:
扩展为code a
?
\bool_new:N \foo_bool
\bool_set_true:N \foo_bool
\cs_new:Nn \foo_bar:
{
\bool_if:NTF \foo_bool
{ code~ a } { code~ b }
}
更新:
这个怎么样?
% `test.pdf` is in the current directory.
\cs_new:Nn \foo_bar:
{
\file_if_exist:nTF { test.pdf }
{ code~ a } { code~ b }
}
(完整问题可以在扩展xeCJK中的条件函数)
答案1
\foo_bool
如果在宏的定义中应该冻结(扩展)的条件值,\cs_new:Nx
则是一种可能性,如果宏应该对的当前值“做出反应” \foo_bool
,请\cs_new:Nn
在此处使用。
我已将名称更改为“正确”的expl3
命名约定。
\documentclass{book}
\usepackage{xparse}
\ExplSyntaxOn
\bool_new:N \l_stone_foo_bool
\bool_set_false:N \l_stone_foo_bool% Set to false, although false by def.
\cs_new:Nn \foo_bar_current:
{
\bool_if:NTF \l_stone_foo_bool
{ code~ a } { code~ b }
}
\cs_new:Nx \foo_bar_expanded:
{
\bool_if:NTF \l_stone_foo_bool
{ code~ a } { code~ b }
}
\NewDocumentCommand{\foo}{}{%
\foo_bar_expanded:
}
\NewDocumentCommand{\foobar}{}{%
\foo_bar_current:
}
\bool_set_true:N \l_stone_foo_bool% For testing
\ExplSyntaxOff
\begin{document}
\foo\ and \foobar
\end{document}
\foo
将扩展为code b
,并且\foobar
将扩展为code a
,因为在定义 之后,同时将 bool 变量设置为 true \foobar
。
答案2
我猜你正在定义一个依赖于某些运行时选项的函数。解决方案是使用\cs_new:Nx
(内部使用\edef
)。
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\bool_new:N \l_stonezeng_foo_bool
% true branch
\bool_set_true:N \l_stonezeng_foo_bool
\cs_new:Nx \stonezeng_foo_t:
{
\bool_if:NTF \l_stonezeng_foo_bool
{
\exp_not:n { code~a }
}
{
\exp_not:n { code~b }
}
}
% false branch
\bool_set_false:N \l_stonezeng_foo_bool
\cs_new:Nx \stonezeng_foo_f:
{
\bool_if:NTF \l_stonezeng_foo_bool
{
\exp_not:n { code~a }
}
{
\exp_not:n { code~b }
}
}
\cs_show:N \stonezeng_foo_t:
\cs_show:N \stonezeng_foo_f:
\stop
这将显示在终端上
> \stonezeng_foo_t:=\long macro:->code a.
> \stonezeng_foo_f:=\long macro:->code b.
注意\exp_not:n
,因此内部代码不会在定义时扩展,而仅在使用时扩展。
记住使用正确的变量和函数命名。