我想定义从 PDF 对象引用中提取 PDF 对象编号的函数,例如12
从12 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
参数,因为它是分隔符。其次,我可能会在这里使用o
或V
扩展,因为您几乎肯定不想进行x
-type 扩展。(每个o
或V
函数都应该有一个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
手动优化变体以提高速度。