perl - Noweb 不交叉引用左侧由 @ 分隔的 Perl 标识符

标签 perl noweb

考虑这个名为 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 identifiers . foo 应该是可识别的标识符,因为与 barbaz 一样,它以字母数字开头,在左侧由符号 ( at 符号),并在右侧用定界符(空格)定界。

我考虑了 at 符号被 Noweb 解释为转义的可能性,并尝试将其加倍,但是 (i) 没有解决问题,并且 (ii) 引入了语法错误 my @@ fooquux.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/

相关文章:

emacs - 有什么方法可以让 org-babel 正确缩进 noweb 纠结的代码吗?

r - knitr 缠结的 R 代码中缺少 block 名称

r - Sweave,R,Beamer : How to convert the LaTex text in an Rnw file to R comments?

database - Perl:如何避免全局并保持数据库连接

perl - 向@INC 添加路径但不在 Perl 脚本中

arrays - 如何在 Perl 中处理可变数量的输入行?

perl - perl 中未提供文件名时如何使用 __DATA__ 句柄

regex - 解析 StarTeam 命令行客户端输出