我有一个从 ShareLaTeX Online 安装中导出(下载)的 LaTeX 项目。根据我在苹果系统在终端中使用以下命令:
文件-I myfile.tex
其结果是:
myfile.tex:文本/x-tex;字符集=us-ascii
原来的错误是:
myfile.tex:8:未定义控制序列。...\numberline {\thechapter }Vortr\UTF{00E4}ge}{\thepage }} l.8 \chapter{Vortr\UTF{00E4}ge}
LaTeX 源代码是(其中 \ 被复制并粘贴到这里作为 ¥ 符号)。原始文件可以在这里下载。
\documentclass[12pt,a4paper,ngerman,onecolumn]{book}
\usepackage[ngerman,english]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\begin{document}
\chapter{Vorträge}
\end{document}
问题是,我能以某种方式解决这个问题吗?我知道 UTF-8 是更好的选择。但是 LaTeX 项目包含许多采用 US-ASCII 编码的文件。
答案1
导出的文件已将 UTF-8 字符替换为宏调用,\UTF{...}
并以十六进制 Unicode 代码点作为参数。宏可以在 TeX 中定义,但这并非在所有情况下都有效(逐字文本等)。因此,最好的方法是编写脚本/程序将宏调用转换回 UTF-8 编码的 Unicode 字符。
这里有一个适用于 Python 3 的简单脚本sharelatex_recode.py
。它将文件作为参数,并在必要时更新文件:
#!/usr/bin/env python
import argparse
import re
import sys
if sys.version_info[0:2] < (3, 2): # tested with 3.6
print('Python >= 3.2 is required.')
sys.exit(1)
def main():
args = parse_command_line()
convert(args.input_file, args.dry_run)
def parse_command_line():
parser = argparse.ArgumentParser(
description=r'Replace TeX macro \UTF{...} calls to UTF-8 characters.',
)
parser.add_argument(
'input_file',
help='input TeX file',
)
parser.add_argument(
'--dry-run',
action='store_true',
help='the file is not updated and written',
)
return parser.parse_args()
def convert(file_name, dry_run):
with open(file_name, 'rb') as handle:
data = handle.read()
new_data, replacements = re.subn(
br'\\UTF\{([0-9A-Fa-f]{4})\}',
repl,
data,
)
if replacements:
print('=> Replacements: {}'.format(replacements))
if not dry_run:
with open(file_name, 'wb') as handle:
handle.write(new_data)
print('=> File written: {}'.format(file_name))
else:
print('=> Already uptodate: {}'.format(file_name))
def repl(match):
code = int(match.group(1), 16)
char = chr(code)
utf8_sequence = char.encode('utf8')
return utf8_sequence
if __name__ == '__main__':
main()
有问题的线路
\chapter{Vortr\UTF{00E4}ge}
变成
\chapter{Vorträge}
也可以.tex
递归转换所有文件,例如bash
:
$ find start_directory -name \*.tex -exec python3 sharelatex_recode.py {} \;
BMP 之外的 Unicode 字符 (基本多文种平面) 不受脚本支持,因为我不知道在这种情况下将 ShareLaTeX 导出到 US ASCII 会产生什么效果。