考虑这个名为 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
标识符 bar
和 baz
在 PDF 输出中作为标识符正确突出显示并交叉引用。标识符 foo
不是。
据我所知,Noweb 有一个 very simple heuristic for recognizing identifiers . foo
应该是可识别的标识符,因为与 bar
和 baz
一样,它以字母数字开头,在左侧由符号 ( at 符号),并在右侧用定界符(空格)定界。
我考虑了 at 符号被 Noweb 解释为转义的可能性,并尝试将其加倍,但是 (i) 没有解决问题,并且 (ii) 引入了语法错误 my @@ foo
到 quux.pl
。这是有道理的,因为根据精细手册,双 at 符号仅在第 1-2 列中进行特殊处理。
最佳答案
Noweb 将 @
视为字母数字,理由是它“有助于 LaTeX”。我在 Noweb 手册中没有找到任何相关信息。这仅记录在 Noweb 版本 2.12 的 Noweb 源文件 finduses.nw
的第 24 行中。
显然,在编写您自己的 LaTeX 程序包时,您定义的任何宏都具有公共(public)范围。要编写“私有(private)”宏,诀窍是暂时将 @
重新分类为包顶部的字母,将 @
合并到每个“私有(private)”的名称中宏,还原包底部的@
类。宏仍然是公开的,但无法调用,因为名称被分解成多个词位。 (用户仍然可以通过在调用前将 @
重新分类为字母来调用此类宏,但如果他们这样做,他们将承担风险。)
所以是的,当代码块包含 LaTeX 包时,@
应该作为字母数字字符包含在内。
被 Noweb 视为字母数字的符号的完整列表是:
_ ' @ #
_
在许多编程语言中被视为标识符字符,因此 Noweb 将其视为字母数字是正确的。#
被视为字母数字,以“避免误命中 C 预处理器指令”。没有给出将
'
视为字母数字的解释。
理想情况下,Noweb 会为每种源语言支持单独的字符类方案。但据我了解,Noweb 只有一个全局字符类方案,并且不支持更改它(除了修改源之外)。
幸运的是,Perl 有数组标识符的替代语法来解决这个限制。您可以编写 @{foo}
甚至 @foo
而不是 @foo
,它会起作用。
关于perl - Noweb 不交叉引用左侧由 @ 分隔的 Perl 标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74748728/