编辑

编辑

我正在尝试了解如何使用 进行基本的字符串操作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,则未指定参数数量,必须查看文档以了解函数的预期语法。

参数类型Nn是最常见的。前者表示参数必须是无支撑单标记,后者意味着该参数必须是标记列表

对于\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 发出错误警报。有什么解决办法吗?更多细节。

相关内容