You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Vim的Perl过滤器查找LaTeX文件中的重复\label?

查找TeX文件中重复\label的Vim过滤器实现

第一步:修正你的Perl脚本

你的原脚本存在几个问题:每次匹配到标签就立刻输出所有已存标签,导致重复内容泛滥;循环与条件判断的代码块闭合不完整;未针对重复出现的标签做筛选。下面是修正后的版本,用__DATA__模拟输入做测试:

#!/usr/bin/perl
use strict;
use warnings;

my %seen;
# 第一遍遍历:统计每个标签的出现次数
while ( <DATA> ) {
    if (/\\label\{([^}]+)\}/) { # 注意反斜杠需要转义
        $seen{$1}++;
    }
}

# 重置DATA指针到开头,准备第二遍遍历找对应行
seek DATA, 0, 0;
# 第二遍遍历:输出重复标签所在的行(带行号)
while ( <DATA> ) {
    if (/\\label\{([^}]+)\}/ && $seen{$1} > 1) {
        print "$. : $_"; # $. 代表当前行号,方便定位
    }
}

__DATA__
        \label{fig:foo}
        \label{fig:bar}
        \label{fig:foo1}
        \label{fig:bar1}
        \label{fig:foo2}
        \label{fig:bar2}
        \label{fig:foo}

脚本说明

  • 两次遍历逻辑:先统计所有标签的出现次数,再回滚到数据开头,筛选并输出重复标签的对应行。
  • 运行脚本后会直接显示重复的\label{fig:foo}所在两行:
    1 :         \label{fig:foo}
    7 :         \label{fig:foo}
    

第二步:做成Vim过滤器

把脚本改成Vim可用的过滤器,有两种常用方式:

方式1:临时过滤当前文件

  1. 将修正后的脚本保存为find_dup_labels.pl,添加执行权限:chmod +x find_dup_labels.pl。
  2. 在Vim中打开目标.tex文件,执行命令:
    :%!./find_dup_labels.pl
    
    这条命令会把当前文件内容作为脚本输入(替代__DATA__),用脚本输出替换当前文件内容,直接显示所有重复标签的行。

方式2:添加Vim命令快速调用

如果需要频繁使用,可以把脚本路径加入Vim配置文件(比如~/.vimrc):

command! -nargs=0 FindDupLabels %!~/path/to/find_dup_labels.pl

保存配置后,在Vim中打开.tex文件,直接输入:FindDupLabels就能快速触发重复标签查找。

额外优化:只输出重复标签汇总

如果不需要显示对应行,只想看哪些标签重复及次数,可以简化脚本:

#!/usr/bin/perl
use strict;
use warnings;

my %seen;
while ( <> ) {
    $seen{$1}++ if /\\label\{([^}]+)\}/;
}

print "重复的标签:\n";
foreach my $label (sort keys %seen) {
    print "$label 出现了 $seen{$label} 次\n" if $seen{$label} > 1;
}

运行后会输出:

重复的标签:
fig:foo 出现了 2 次

内容的提问来源于stack exchange,提问作者Marek Stepanek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:14:56