考虑下面这个名为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)在quux.pl
中引入了语法错误my @@foo
,这是有道理的,因为根据精细手册,只有在第1-2列中才会对双at符号进行特殊处理。
1条答案
按热度按时间4c8rllxm1#
Noweb将
@
视为字母数字,理由是它“有助于LaTeX”。我在Noweb手册中没有找到任何关于这方面的内容。这只在Noweb 2.12版的Noweb源文件finduses.nw
第24行中有记录。显然,在编写自己的LaTeX包时,您定义的任何宏都具有公共作用域。要编写“私有”宏,诀窍是临时将
@
重新分类为包顶部的字母,将@
合并到每个“私有”宏的名称中,并在包底部恢复@
类。宏仍然是公共的。但由于名称被分解为多个词素,因此无法调用。(用户仍然可以通过在调用之前将@
重新分类为字母来调用这样的宏,但如果这样做,他们将承担风险。)因此,是的,当代码块包含LaTeX包时,
@
应该作为字母数字字符包含在内。被Noweb视为字母数字的符号的完整列表为:
_
被视为标识符字符,因此Noweb将其视为字母数字字符是正确的。#
被视为字母数字,以“避免在C预处理器指令上的错误命中”。'
视为字母数字的解释。理想情况下,Noweb会为每种源语言支持单独的字符类模式。但据我所知,Noweb只有一个全局字符类模式,并且不支持更改它(除了修改源代码)。
幸运的是,Perl为数组标识符提供了替代语法,可以绕过这个限制,你可以写
@{foo}
或者甚至@ foo
来代替@foo
。