我正在尝试使用 \verbatiminput 导入一些日志文件,以便从我们的日志中自动生成报告。我遇到了一些编码问题。
我的目标:逐字导入一些包含各种特殊字符(包括隐藏字符)的日志文件。
- 我相信该文件属于 ISO-8859-1。(服务器操作系统是 Windows)
- 我得到了很多文件。所以通常的解决方案“重写它”/“查找错误的字符”不是一个选项。
- 我从 mac osx 运行 pdflatex。
- 我使用以下方法转换了文件(注意 -c 选项可以删除错误的字符)
。
for file in ./test*/*.txt
do
iconv -c -f ISO-8859-1 -t utf8 $file > $file.n1
mv -f $file.n1 $file
done
我的 tex 标头:
\usepackage{verbatim}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
我收到的错误信息:
! Package inputenc Error: Unicode char \u8:° not set up for use with LaTeX.
为了解决“程度”问题,我添加了
cat $file.n1 | tr '°' 'º' > $file.n2
然后我在另一个文件上遇到另一个错误,这次带有一个不可见的字符。
! Package inputenc Error: Unicode char \u8: not set up for use with LaTeX.
我首先尝试不转换文件并将它们导入为 T1/latin1 或 LY1/ascinew,但出现了错误
! Package inputenc Error: Keyboard character used is undefined
(inputenc) in inputencoding `latin1'.
在不同的文件上。
我的问题:
- 有没有办法忽略/替换所有有故障的字符?
- 来自 LaTeX ?来自 shell ?
- 使用“tr”还是“iconv”?
- 我在导入文件/进行转换时做错了什么吗?
- 使用哪种编码会让我遇到的问题更少?
欢迎任何帮助,因为我已经两天没有解决这个问题了。
PS:我的问题不是特定于度数符号,而是 LaTeX 无法打印出的 unicode 字符。
答案1
是的,你可以更换有故障的字符。你可以°
用\ensuremath{^\circ}
或者添加到你的 latex 标题中:
\newcommand{\degree}{\ensuremath{^\circ}}
\DeclareUnicodeCharacter{B0}{\degree}
或者您可以使用xelatex
,那么就没有必要了,\usepackage[utf8]{inputenc}
因为它已经utf8
内置了完整的支持。
编码没有问题,但 Latex 不知道如何处理 unicode 符号:D
答案2
该字符实际上并未包含在模块°
所作的定义中。utf8
inputenc
\usepackage{textcomp} % for \textdegree
\usepackage{newunicodechar} % for \newunicodechar
\newunicodechar{°}{\textdegree}
或者,你可以使用“手工制作的符号”
\newunicodechar{°}{\ensuremath{{}^\circ}}
它将在文本和数学模式下起作用(并且textcomp
不需要)。
其优点newunicodechar
是它不需要知道我们想要为其定义命令的字符的 Unicode 点。
当然,“程度”的情况只是一个例子:您可以添加所需的所有字符。
但是,如果你的文件是Latin-1 编码(ISO 8859-1),您可以在输入之前尝试切换到此编码:
\usepackage[latin1,utf8]{inputenc} % utf8 is default
\newcommand{\latinoneverbatiminput}{%
\begingroup\inputencoding{latin1}\verbatiminput{#1}\endgroup}
然后\latinoneverbatiminput{file}
将使用 Latin-1 file
。
答案3
您不需要重新编码文件。但您必须在加载文件之前声明/更改文件的编码:
\begingroup
\inputencoding{whatever}
\verbatiminput{file}
\endgroup
I don't know what value you should use for "whatever". On windows I would at first try "ansinew" (latin1 has a less chars declared).