如何找到 LaTeX 不喜欢的字符?

如何找到 LaTeX 不喜欢的字符?

我在为我的团队撰写的文献报告中使用了带有biberbiblatex和的导出 .bib 条目\usepackage[utf8]{inputenc}。这意味着大多数标准的烦人字符(à 等)都会被自动处理。但是,有很多字符没有被自动处理。此外,它会在命令行上打印乱码。

\u8:�

这是我能得到的最接近的结果(通过 pdflatex file.tex >demo.txt),我认为它在命令行上给出了实际的乱码,具体取决于符号是什么。它也没有说明该字符在 bib 文件中的位置,所以我必须尝试在这里使用几次 kill 并完全运行以猜测条目...

这意味着我经常需要搜索整个文档以找到出错的字符。通常它甚至不是一个字母,但有人使用了非 ASCII 连字符或类似的东西。有没有一种简单的方法来检查文件中是否存在非 LaTeX 认可的字符?

我发现最接近的方法是 emacs 中的某种模式,它可以将非 ASCII 字符变为红色,但我忘记了如何做到这一点,而且我仍然无法注意到 3000 行文件中一个略带红色的连字符。有没有更好的工具?或者有人知道该如何重新启用该模式?

答案1

我在准备参考书目时遇到了同样的问题,我设法用文本编辑器解决了它Sublime Text。打开 tex 文件并按 Ctrl+F,确保正则表达式(第一个按钮)已打开并输入[^\x00-\x7F]以查找。特殊字符已圈出。

例如这里

答案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 字符替换器效果可能更好,尤其是对于大量文本,因为您不必手动查找给您带来问题的字符。另一方面,很难看出问题出在哪里,这有时可能很有用。

相关内容