\tl_if_in:NnT 究竟如何工作?

\tl_if_in:NnT 究竟如何工作?

我正在尝试实现土耳其语插入音的插入。如果输入以 开头,则在in, ın, un, ün前面添加n。如果不是,则我们查看第一个字母。这次,y如果第一个字母是 之一,我们会在前面添加i, ı, u, ü, a, e, l

我正在尝试了解其\tl_if_in:NnT工作原理。我想检查某个字符串是否在字符串列表中。

这是我尝试过的代码,但它不起作用。

列表

\tl_set:Nx \l_genitive_sole_tl {{in} {ın} {un} {ün}}

针:它应该是参数的前两个字母#1

\tl_set:Nx  \l_first_tl {\tl_range:Nnn {#1} {1} {2}}

测试

\tl_if_in:NnTF \l_genitive_sole_tl  \l_first_two_tl
{
 code if TRUE
}

编辑:添加了示例文档。抱歉,第一次发帖时没有这样做。

\documentclass{article}

\ExplSyntaxOn
\tl_set:Nx \l_genitive_sole_tl {{in} {ın} {un} {ün}}
\tl_set:Nx \l_vowel_init_tl {{i} {ı} {u} {ü} {a} {e} {l}}
\tl_new:N \l_first_tl
\tl_new:N \l_suffix_tl
\tl_new:N \l_first_two_tl

\NewDocumentCommand{\addEP}{m}{
    \tl_set:Nx \l_suffix_tl {-{#1}}
    \tl_set:Nx  \l_first_tl {\tl_range:Nnn {#1} {1} {1}}    
    \tl_set:Nx  \l_first_two_tl {\tl_range:Nnn {#1} {1} {2}}
    \tl_if_in:NnTF \l_genitive_sole_tl \l_first_two_tl
    {
        \tl_set:Nx \l_suffix_tl {-n{#1}}
    }{
        \tl_if_in:NnT \l_vowel_init_tl  \l_first_tl
        {
            \tl_set:Nx \l_suffix_tl {-y{#1}}
        }
    }
    new suffix:
    \l_suffix_tl
}
\ExplSyntaxOff

\begin{document}

\noindent
\addEP{in} % expect -nin here

\\
\addEP{ı} % expect -yı here

\end{document}

答案1

您想seq在这里使用 a 而不是 a,tl因为您需要测试一系列项目。

在此处输入图片描述

以上是使用 lualatex 或 xelatex 的输出。使用 pdflatex 时,如果不进行更多工作,您将无法获得该结果,因为这里采用的第一个标记只会为您提供多字节 UTF-8 字符的第一个字节,而不是整个第一个字符。

\documentclass{article}

\ExplSyntaxOn
% here you want a sequence and there is no expansion possible, so do not need x
\seq_const_from_clist:Nn \l_genitive_sole_seq {in, ın, un, ın}
\seq_const_from_clist:Nn \l_vowel_init_seq {i, ı, u, ı, a, e, l}
% The above both have repeated entries, is that intended?

\tl_new:N \l_first_tl
\tl_new:N \l_suffix_tl
\tl_new:N \l_first_two_tl

\NewDocumentCommand{\addEP}{m}{
% I (think) you want no expansion and no {} around #1
    \tl_set:Nn \l_suffix_tl {-#1}
% Never use a brace group with an N argument
% Note this takes the first 1 or 2 tokens, so in pdftex this is the first
% byes of a multi-bye utf-8 character, not the first one or two characters.
    \tl_set:Nx  \l_first_tl {\tl_range:nnn {#1} {1} {1}}    
    \tl_set:Nx  \l_first_two_tl {\tl_range:nnn {#1} {1} {2}}

% V here as you want to test if the Value of \l_first_two_tl is in
    \seq_if_in:NVTF \l_genitive_sole_seq \l_first_two_tl
    {
% You do not want braces around #1, and no expansion so n not x
        \tl_set:Nn \l_suffix_tl {-n#1}
    }{
% V again
        \seq_if_in:NVT \l_vowel_init_seq  \l_first_tl
        {
% You do not want braces around #1, and no expansion so n not x
            \tl_set:Nn \l_suffix_tl {-y#1}
        }
    }
%    new suffix:
    \l_suffix_tl
}
\ExplSyntaxOff

\begin{document}


\addEP{in} % expect -nin here


\addEP{ı} % expect -yi here

\end{document}

更新问题之前的原始答案

\documentclass{article}

\begin{document}

\ExplSyntaxOn
\tl_set:Nx \l_genitive_sole_tl {{in} {ın} {un} {ın}}



\tl_set:Nx  \l_first_tl {\tl_range:Nnn {#1} {1} {2}}



\tl_if_in:NnTF \l_genitive_sole_tl  \l_first_two_tl
{
 code ~if ~TRUE
}

{
 code ~if ~False
}

\ExplSyntaxOff
\end{document}

如果为假则生成代码

因为的内容\l_genitive_sole_tl 不包含令牌\l_first_two_tl

如果你注意总是用n括号括起来而不是用括号括起来N论点,事情可能会更清楚,所以最后的测试将是

\tl_if_in:NnTF \l_genitive_sole_tl {\l_first_two_tl}

我确实想知道你是否打算

\exp_args:NNV\tl_if_in:NnTF \l_genitive_sole_tl  \l_first_two_tl

测试的值,l_first_two_tl 但是该值未在任何地方定义。

\exp_args:NNV\tl_if_in:NnTF \l_genitive_sole_tl  \l_first_tl

这将是有效的测试,因为它有定义,除了l_first_tl有定义

\l_first_tl=macro:
->##1

并且明确不允许您使用 进行#测试tl_if_in


以下代码显示了两个有效测试,对 返回 TRUE in,对 返回 False on

\documentclass{article}

\begin{document}

\ExplSyntaxOn
\tl_set:Nx \l_genitive_sole_tl {in ın un ın}



\tl_if_in:NnTF \l_genitive_sole_tl {in}
{
 code ~if ~TRUE
}
{
 code ~if ~False
}

\par

\tl_if_in:NnTF \l_genitive_sole_tl {on}
{
 code ~if ~TRUE
}
{
 code ~if ~False
}

\ExplSyntaxOff
\end{document}

相关内容