我正在尝试实现土耳其语插入音的插入。如果输入以 开头,则在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}