LaTeX3:函数参数的扩展

LaTeX3:函数参数的扩展

我想定义从 PDF 对象引用中提取 PDF 对象编号的函数,例如1212 0 R

我定义了两个版本的此类函数,一个是低级函数,另一个是高级函数。低级函数接受 PDF 对象引用作为文字字符串(如上文所述),并提取对象编号12。这个函数我已开始工作。

然而,高级函数接受引用作为标记列表变量,但不幸的是失败了。它应该首先扩展标记列表变量并将其传递给低级函数。有人能找到高级函数中的错误吗?

以下是我编写的代码:

\documentclass{article}
\usepackage{expl3}

\begin{document}

\ExplSyntaxOn
\tl_new:Nn\oref{12~0~R} %define some object reference

\cs_new:Npn \lolevel:n #1~0~R {#1}
\cs_new:Nn \hilevel:x {\lolevel:n #1}

Ref:~\oref\par
Num:~\lolevel:n 12~0~R\par  %this works!
%Num:~\hilevel:x \oref      %doesn't :(
\ExplSyntaxOff

\end{document}

答案1

您的代码中对于参数规范的工作方式存在一些误解,其中一个实际上导致了问题。

实际问题是 的定义\hilevel:x不进行任何扩展。简单地给函数一个x参数并不能“神奇地”进行扩展。您需要使用\cs_generate_variant:Nn(自动)或在函数本身内定义扩展。

概念上的误解在于如何判断事物是什么样的参数。首先,\lowlevel:n不是一个n函数:这是一个w参数,因为它是分隔符。其次,我可能会在这里使用oV扩展,因为您几乎肯定不想进行x-type 扩展。(每个oV函数都应该有一个n等效函数,并且每个c函数都需要一个N“父函数”。)

因此,一种方法是

\cs_new:Npn \lolevel:w #1~0~R {#1}
\cs_new:Npn \hilevel:n #1 { \lolevel:w #1 }
\cs_generate_variant:Nn \hilevel:n { V }

或者

\cs_new:Npn \lolevel:w #1~0~R {#1}
\cs_new:Npn \hilevel:n #1 { \lolevel:w #1 }
\cs_new:Npn \hilevel:o #1 { \exp_after:wN \lolevel:w #1 }

o手动优化变体以提高速度。

相关内容