我有一个 UTF-8 编码的 LaTeX 文档:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\begin{document}
äääääääääääääääööööööööööööööööööööööüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüääääääääääääääääääääääääääääääääääüüüüüüüüüüüüüü
\end{document}
pdflatex
当在 MacOS X 上使用 UTF-8 语言环境的终端上编译此程序时,(预期的)overfull \hbox
警告以 Latin1 编码出现 – 在终端和日志文件中:
This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/MacPorts 2013_1) (format=pdflatex 2013.7.29) 2 SEP 2013 17:28
entering extended mode
restricted \write18 enabled.
%&-line parsing enabled.
**test
<SNIP>
Overfull \hbox (419.53918pt too wide) in paragraph at lines 7--8
[]\T1/cmr/m/n/10 äääääääääääääääööööööööööööööööööööööüüüüüüüüüüüüüüüüüüüüüüüüü
üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüääääääääääääääääääääääääääääääääääüüüüüüüüüüüüüü
[]
[1
{/opt/local/var/db/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./test.aux) )
Here is how much of TeX's memory you used:
617 strings out of 494181
5593 string characters out of 6156676
52409 words of memory out of 5000000
3964 multiletter control sequences out of 15000+600000
4403 words of font info for 15 fonts, out of 8000000 for 9000
470 hyphenation exceptions out of 8191
23i,4n,17p,299b,113s stack positions out of 5000i,500n,10000p,200000b,80000s
{/o
pt/local/share/texmf-texlive/fonts/enc/dvips/cm-super/cm-super-t1.enc}</opt/loc
al/share/texmf-texlive/fonts/type1/public/cm-super/sfrm1000.pfb>
Output written on test.pdf (1 page, 12195 bytes).
PDF statistics:
13 PDF objects out of 1000 (max. 8388607)
8 compressed objects within 1 object stream
0 named destinations out of 1000 (max. 500000)
1 words of extra memory for PDF output out of 10000 (max. 10000000)
我正在对日志文件使用后过滤程序(即pydflatex
由 Olivier Verdier 编写的程序需要 UTF-8 编码输入,因此在这一行处中断。
那么,什么决定了 LaTeX 日志文件的编码?我该如何改变它?
答案1
使用 LaTeX(与 LuaLaTeX 和 XeLaTeX 相反)的 Unicode 输入无法在内部处理中保留,尤其是在显示有关过满框的消息时会丢失。
这些消息显示的是实际用于排版的字符的表示,它们不再是 Unicode,而是对应于当前输出编码中的插槽。
例如,ä
成为第一是\"a
因为
\DeclareUnicodeCharacter{00E4}{\"a}
然后与 T1 编码utf8enc.dfu
相关的宏将其翻译为“在插槽中打印字符”,因为fontenc
0xE4
\DeclareTextComposite{\"}{T1}{a}{228}
(t1enc.def
十进制的 228 是十六进制的0xE4
)。这实际上是 Latin-1 中的相同位置ä
,但 T1 编码与 Latin-1 不同;例如,ß
位于 0xFF
T1 中的位置 255 =,而在 Latin-1 中位于位置 223 = 0xDF
。
您需要的是一个过滤器,用于将 T1(或其他输出编码)转换回 Unicode。该过滤器还应考虑所使用的字体,该字体的名称中包含输出编码:这不是一项简单的任务,尤其是对于数学符号而言。