在 LaTeX3 中扩展条件函数

在 LaTeX3 中扩展条件函数

如何使其\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,因此内部代码不会在定义时扩展,而仅在使用时扩展。

记住使用正确的变量和函数命名。

相关内容