采用 US-ASCII 编码的德语变音符号

采用 US-ASCII 编码的德语变音符号

我有一个从 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 会产生什么效果。

相关内容