在 C 语言中,有一个#line
,它允许说明特定代码行的来源。这对于自动生成的 C 源文件很有用:生成的文件中的(不可读)代码将映射回原始源。所有后续行都将从最后一条#line
指令继承文件名并推进行计数器。这是一个完全人为的例子:
源文件input.in
:
a <- b* c
c <- (a)
自动生成的 C 源代码input.in.c
:
#line 1 "input.in"
while (b) do_b();
#line 1 "input.in"
do_c();
#line 2 "input.in"
do_open_paren();
#line 2 "input.in"
do_a();
#line 2 "input.in"
do_close_paren();
TeX 中是否有类似的东西?要怎么做才能让 TeX 认为它位于特定源文件的特定行中,并从下一行的开头开始生效?
本练习的目的是让 SyncTeX 引用原始文件而不是自动生成的代码。自动生成的 TeX 文件会在以下情况下出现:针织R,如果你自动将 \input{fileX} 替换为 fileX 的内容当然,代码生成器必须将#line
等效内容发出到生成的代码中。
答案1
TeX 有一个内部寄存器\inputlineno
用于跟踪行号。
aaaa \the\inputlineno
aaaa \the\inputlineno
\newcount \inputlineno \inputlineno=3 xaaaa \the\inputlineno
如上所示,您无法为其分配,但可以使用同名的计数寄存器对其进行屏蔽。我不知道 synctex,但如果它从 csname 中获取值,\inputlineno
而不是直接访问原语,那么如果在生成的文件的每个部分中,您为屏蔽的副本分配一个值,这可能就足够了\inputlineno