我在为我的团队撰写的文献报告中使用了带有biber
、biblatex
和的导出 .bib 条目\usepackage[utf8]{inputenc}
。这意味着大多数标准的烦人字符(à 等)都会被自动处理。但是,有很多字符没有被自动处理。此外,它会在命令行上打印乱码。
\u8:�
这是我能得到的最接近的结果(通过 pdflatex file.tex >demo.txt),我认为它在命令行上给出了实际的乱码,具体取决于符号是什么。它也没有说明该字符在 bib 文件中的位置,所以我必须尝试在这里使用几次 kill 并完全运行以猜测条目...
这意味着我经常需要搜索整个文档以找到出错的字符。通常它甚至不是一个字母,但有人使用了非 ASCII 连字符或类似的东西。有没有一种简单的方法来检查文件中是否存在非 LaTeX 认可的字符?
我发现最接近的方法是 emacs 中的某种模式,它可以将非 ASCII 字符变为红色,但我忘记了如何做到这一点,而且我仍然无法注意到 3000 行文件中一个略带红色的连字符。有没有更好的工具?或者有人知道该如何重新启用该模式?
答案1
答案2
作为一名生产编辑,我经常需要执行此任务,其中提供的文件具有混合编码。我编写了一个名为的小型 bash 脚本,findnonascii
只需运行grep
:
#!/bin/sh
grep -n -P "[^|a-zA-Z\{\}\s%\./\-:;,0-9@=\\\\\"'\(\)_~\$\!&\`\?+#\^<>\[\]\*]" $@
示例文件:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\begin{document}
Sample character: õ
Another one: â
And again: ê
\end{document}
输出findnonascii test.tex
:
7: Sample character: õ
9: Another one: â
11: And again: ê
它给出了行号,因此它缩小了搜索范围。
编辑:
下面是一个提供与平台无关的替代方案的 Perl 脚本:
#!/usr/bin/perl -w
use strict;
use warnings;
use feature 'unicode_strings';
if ($#ARGV == -1)
{
die "Syntax: $0 <filename>+\n";
}
foreach my $filename (@ARGV)
{
open (my $FH, $filename)
or die "Can't open '$filename' $!\n";
my $linenum = 0;
while (<$FH>)
{
$linenum++;
if (/[^|a-zA-Z\{\}\s%\.\/\-:;,0-9@=\\\\\"'\(\)_~\$\!&\`\?+#\^<>\[\]\*]/)
{
print $#ARGV > 0 ? "$filename " : '', "l.$linenum: ", $_;
}
}
close $FH;
}
1;
编辑2:
以下是一些小小的修改,将会突出显示字符,以便更容易看到(我不知道它是否适用于 Windows):
#!/usr/bin/perl -w
use strict;
use warnings;
use feature 'unicode_strings';
use Term::ANSIColor;
if ($#ARGV == -1)
{
die "Syntax: $0 <filename>+\n";
}
foreach my $filename (@ARGV)
{
open (my $FH, $filename)
or die "Can't open '$filename' $!\n";
my $linenum = 0;
while (<$FH>)
{
$linenum++;
if (s/([^|a-zA-Z\{\}\s%\.\/\-:;,0-9@=\\\\\"'\(\)_~\$\!&\`\?+#\^<>\[\]\*]+)/&highlight($1)/eg)
{
print $#ARGV > 0 ? "$filename " : '', "l.$linenum: ", $_;
}
}
close $FH;
}
sub highlight{
my $text = $_[0];
colored($text, 'on_bright_red');
}
1;
上面使用的模式是 ASCII 的一个子集,因为 TeX 通常不喜欢控制字符(尽管我很少遇到带有控制代码的 LaTeX 文件)。一个更简单的模式是[^ -~]
排除 ( [^
... ]
) 范围 (开始-
结尾) 从空格 ( ,0x20) 到波浪符号 (
~
,0x7E)。请注意,此范围不包括 TAB 字符 (0x09),(La)TeX 通常将其解释为空格。如果您还想在搜索中忽略 TAB,请使用[^ -~\t]
。复杂的文本编辑器通常允许正则表达式搜索,并且应该接受该模式。
答案3
VIM 方法
我在复制和粘贴文本时经常遇到这个问题。我还经常不小心输入(不可见的)不间断空格(ALT-SPACE
在 Mac 键盘上)。要识别此类字符,请执行以下操作:
首先
:set hls
让 VIM 突出显示所有搜索结果。然后使用搜索/[
<RANGE>
]
ASCII 码范围在<128>
和之间的字符<255>
。您可以按 以 ASCII 码输入字符CTRL-V
,然后输入三位十进制 ASCII 码:
/[
CTRL-V128
-
CTRL-V255
]
ENTER
所有非 ASCII 字符均会突出显示,您可以像往常一样使用n
和在它们之间导航N
。要停止突出显示搜索结果,请使用:set nohls
。
答案4
可能最简单的方法是将您的文本粘贴到以下网站之一:
Unicode 字符检测器--- 将注释“奇怪”的字符,因此它会以图形方式概述所用字符的类型并帮助您找到问题。这听起来类似于您提到的“字符变红”。
非 ASCII 字符替换器效果可能更好,尤其是对于大量文本,因为您不必手动查找给您带来问题的字符。另一方面,很难看出问题出在哪里,这有时可能很有用。