Noweb不会交叉引用左侧以@分隔的Perl标识符

1hdlvixo  于 2022-12-13  发布在  Perl
关注(0)|答案(1)|浏览(138)

考虑下面这个名为quux.nw的Noweb源文件:

\documentclass{article}
\usepackage{noweb}
\usepackage[colorlinks]{hyperref}
\begin{document}
<<quux.pl>>=
my @foo ;
my $bar ;
my %baz ;
@ %def foo bar baz
\end{document}

并使用以下命令进行编译:

$ noweb quux.nw
$ latexmk -pdf quux.tex

标识符barbaz在PDF输出中正确突出显示为标识符并交叉引用。标识符foo未突出显示。
据我所知,Noweb有一个very simple heuristic for recognizing identifiersfoo应该可以被识别为标识符,因为像barbaz一样,它以字母数字开头,左边由一个符号(at符号)分隔,右边由一个分隔符(空格)分隔。
我考虑到了at符号被Noweb解释为转义的可能性,并尝试将其加倍,但(i)没有解决问题,(ii)在quux.pl中引入了语法错误my @@foo,这是有道理的,因为根据精细手册,只有在第1-2列中才会对双at符号进行特殊处理。

4c8rllxm

4c8rllxm1#

Noweb将@视为字母数字,理由是它“有助于LaTeX”。我在Noweb手册中没有找到任何关于这方面的内容。这只在Noweb 2.12版的Noweb源文件finduses.nw第24行中有记录。
显然,在编写自己的LaTeX包时,您定义的任何宏都具有公共作用域。要编写“私有”宏,诀窍是临时将@重新分类为包顶部的字母,将@合并到每个“私有”宏的名称中,并在包底部恢复@类。宏仍然是公共的。但由于名称被分解为多个词素,因此无法调用。(用户仍然可以通过在调用之前将@重新分类为字母来调用这样的宏,但如果这样做,他们将承担风险。)
因此,是的,当代码块包含LaTeX包时,@应该作为字母数字字符包含在内。
被Noweb视为字母数字的符号的完整列表为:

_ ' @ #
  • 在许多编程语言中,_被视为标识符字符,因此Noweb将其视为字母数字字符是正确的。
  • #被视为字母数字,以“避免在C预处理器指令上的错误命中”。
  • 没有给出将'视为字母数字的解释。

理想情况下,Noweb会为每种源语言支持单独的字符类模式。但据我所知,Noweb只有一个全局字符类模式,并且不支持更改它(除了修改源代码)。
幸运的是,Perl为数组标识符提供了替代语法,可以绕过这个限制,你可以写@{foo}或者甚至@ foo来代替@foo

相关问题