我正在尝试了解如何使用 进行基本的字符串操作expl3
。以下是我目前所掌握的:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\str_set_eq:NN \l_tmpa_str \str_uppercase:n{hello}
\l_tmpa_str
\ExplSyntaxOff
\end{document}
当我使用 进行编译时,我没有收到错误latexmk -jobname=test -lualatex .\uppercasing_strings.tex
,但是生成的 pdf 的内容不是我所期望的:
此外,如果我尝试,str_show:N \l_tmpa_str
我会收到一个错误:
LaTeX3 错误:变量“\l_tmpa_str”不是有效的 str。
我做错了什么?如何将值输出\l_tmpa_str
到终端和我的 pdf?
编辑
代码
根据评论,MWE 支持论点
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\str_set:Nx {\l_tmpa_str} {\str_uppercase:n {hello}}
\str_show:N \l_tmpa_str
\ExplSyntaxOff
\end{document}
错误信息
------------
Running 'lualatex -recorder --jobname="test" "./uppercasing_strings.tex"'
------------
This is LuaHBTeX, Version 1.15.0 (TeX Live 2022)
restricted system commands enabled.
(./uppercasing_strings.tex
LaTeX2e <2021-11-15> patch level 1
L3 programming layer <2022-04-10>
(c:/texlive/2022/texmf-dist/tex/latex/base/article.cls
Document Class: article 2021/10/04 v1.4n Standard LaTeX document class
(c:/texlive/2022/texmf-dist/tex/latex/base/size10.clo))
(c:/texlive/2022/texmf-dist/tex/latex/l3backend/l3backend-luatex.def)
(./test.aux) (c:/texlive/2022/texmf-dist/tex/latex/base/ts1cmr.fd)
> \l_tmpa_str=HELLO.
<recently read> }
l.9 \str_show:N \l_tmpa_str
?
答案1
函数名expl3
遵循相当严格的模式。它们应该以 或 开头\<module>
(\__<module>
分别表示公共函数和私有函数),其中<module>
是“模拟”命名空间的字母字符串,以减少不同包之间名称冲突的可能性。
第一部分之后,是描述函数工作原理的内容。\str_set_eq:NN
模块中的内容是str
(字符串操作),描述部分是_set_eq
。
在“专有名词”之后,一个冒号和签名遵循。此签名指定函数操作的参数数量,并可能对它们进行一些预处理。例外:如果签名以 结尾w
,则未指定参数数量,必须查看文档以了解函数的预期语法。
参数类型N
和n
是最常见的。前者表示参数必须是无支撑单标记,后者意味着该参数必须是标记列表。
对于\str_set_eq:NN
,签名告诉您该函数需要两个参数,应该是单个标记.因此在
\str_set_eq:NN \l_tmpa_str \str_uppercase:n { hello }
即使不知道是什么,人们也可以立即发现语法错误\str_set_eq:NN
,因为这个函数会不断地\l_tmpa_str
运行\str_uppercase:n
。
它做什么\str_set_eq:NN
?它将第一个标记(应该是一个str
变量)设置为具有与第二个标记(也应该是一个变量)相同的当前值str
。
所有其他类型的变量都有类似的功能。
在您的例子中,您不想将其设置\l_tmpa_str
为另一个变量的值str
,而是设置为您当时声明的值。因此您需要的是
\str_set:Nn
或其变体。如果您这样做
\str_set:Nn \l_tmpa_str { hello }
您正在将变量设置为具有指定值。但在这种情况下,您希望“预处理”作为参数给出的字符串,以便将其大写传递。好的,我们可以使用变体
\str_set:Nx \l_tmpa_str { \str_uppercase:n { hello } }
参数类型x
意味着参数应该再次是一个带括号的标记列表,但它将是全X潘德然后传递给主函数。因此,此调用将与
\str_set:Nn \l_tmpa_str { HELLO }
在interface3.pdf
你看到的\str_set:Nx
预定义变体中\str_set:Nn
但如果你需要一些变体,你可以自己生成
\cs_generate_variant:Nn \str_set:Nn { Nx }
(根据必要情况进行调整)。
让我们看看手册上是怎么说的\str_set_eq:NN
这强调了参数都应该是str
变量。
还有另一个警告。在争论\str_uppercase:n
中起作用吗x
?是的,因为在文档中我们看到
并且 ⋆ 表示该函数将在完全扩展上下文中起作用。
请注意,与某些给出的建议相反,第一个论点\str_set:Nn
应该不是必须用大括号括起来。说实话,就 TeX 而言,大括号并没有什么坏处,但它们会使编码不一致。类型为N
或的参数V
参数应该绝不做好准备;所有其他人也应该这样做。
答案2
在初始示例中,将执行的代码是......
\str_set_eq:NN \l_tmpa_str \str_uppercase:n
这是错误的,因为\str_uppercase:n
它不是 ⟨str var⟩。
相反,你想要
\str_set:Nx \l_tmpa_str {\str_uppercase:n {hello}}
设置\l_tmpa_str
为 的扩展值\str_uppercase:n {hello}
。
关于编辑,请注意show
命令将暂停编译,您可以按 Enter 继续。请参阅在非停止模式下使用 \show 会导致 TeXmaker 发出错误警报。有什么解决办法吗?更多细节。