![来自翻译 \GetTranslation 的 PDF 元数据产生了错误的字符编码?](https://linux22.com/image/404567/%E6%9D%A5%E8%87%AA%E7%BF%BB%E8%AF%91%20%5CGetTranslation%20%E7%9A%84%20PDF%20%E5%85%83%E6%95%B0%E6%8D%AE%E4%BA%A7%E7%94%9F%E4%BA%86%E9%94%99%E8%AF%AF%E7%9A%84%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%EF%BC%9F.png)
在编写我自己的课程时,我使用包\GetTranslation
来translations
允许使用不同的语言并\hypersetup
设置hyperref
PDF 元数据。
如果我\GetTranslation
在文档中使用,utf8 特殊字符会被正确编码。但是,如果我将其用于\GetTranslation
PDF 元数据,utf8 特殊字符会被错误地解释为 ISO 8859-1 字符,例如,ä
而不是ä
。如果我直接将 utf8 特殊字符用于 PDF 元数据,它们会被正确编码。
以下 MWE 产生是“Töst”还是“Täst”在文件中,但 或 Töst在 PDF 标题中。
为什么会出现这种情况?我该如何修复它,以便特殊字符\GetTranslation
在 PDF 元数据中正确编码?
使用\"a
而不是ä
会\NewTranslation
产生警告(“PDF 字符串(Unicode)中不允许使用令牌,删除 \" ”)并且还是味道仍然是 PDF 标题。
平均能量损失
\documentclass[ngerman]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{translations}
\DeclareTranslationFallback{test}{Test}
\NewTranslation{ngerman}{test}{Täst}
\usepackage[pdfencoding=auto,psdextra,pdftex]{hyperref}
\AtBeginDocument{
\hypersetup{
pdftitle = {\mytitle}
}
}
\newcommand{\mytitle}{Töst or \GetTranslation{test}}
\begin{document}
\mytitle
\end{document}
答案1
翻译包用 a 包围输出\unexpanded
,这将停止超链接处理:
\newcommand*\@trnslt@translation@value[2]{%
\unexpanded\expandafter\expandafter\expandafter{%
\csname @trnslt@word@\detokenize{#1}@#2\endcsname
}%
}
您可以尝试避免这种情况的变体\GetTranslation
(我不太确定语言部分是否正确,对于未知的翻译,它可能会失败)。如果翻译的文本包含脆弱的命令,您可能需要\texorpdfstring
在章节标题中使用它:
\documentclass[ngerman]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{translations}
\DeclareTranslationFallback{test}{Test}
\NewTranslation{ngerman}{test}{Täst}
\usepackage[pdfencoding=auto,psdextra]{hyperref}
\makeatletter
\newcommand\GetTranslationPDF[1]{%
\csname @trnslt@word@\detokenize{#1}@\@trnslt@language{\@trnslt@current@language}\endcsname
}
\makeatother
\AtBeginDocument{
\hypersetup{
pdftitle = {\mytitle}
}
}
\newcommand{\mytitle}{\GetTranslationPDF{test}}
\begin{document}
\tableofcontents
\section{\GetTranslationPDF{test}}
\end{document}
编辑
以下内容也可以用于没有翻译的语言。但最好向软件包作者提出功能请求
\documentclass[ngerman]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{translations}
\DeclareTranslationFallback{test}{Test}
\NewTranslation{ngerman}{test}{Täst}
\usepackage[pdfencoding=auto,psdextra,pdftex]{hyperref}
\makeatletter
\newcommand*\@trnslt@checkandget@translation@forPDF[2]{%
\@trnslt@if@translation{#1}{#2}
{\@trnslt@get@translation@forPDF{#1}{#2}}
{%
\@trnslt@if@translation{#1}{fallback}
{\@trnslt@translation@valuePDF{#1}{fallback}}
{\@trnslt@translation@valuePDF{#1}{literal}}%
}%
}
\newcommand*\@trnslt@get@translation@forPDF[2]{%
\@trnslt@if@dialect{#2}
{%
\@trnslt@if@translation@valuePDF{#1}{\@trnslt@dialect{#2}}
{\@trnslt@translation@valuePDF{#1}{\@trnslt@dialect{#2}}}
{\@trnslt@translation@valuePDF{#1}{\@trnslt@dialect@of{#2}}}%
}
{\@trnslt@translation@valuePDF{#1}{\@trnslt@language{#2}}}%
}
\newcommand*\@trnslt@translation@valuePDF[2]{%
\csname @trnslt@word@\detokenize{#1}@#2\endcsname
}
\newcommand*\GetTranslationPDF[1]{%
\@trnslt@checkandget@translation@forPDF{#1}{\@trnslt@current@language}}
\makeatother
\AtBeginDocument{
\hypersetup{
pdftitle = {\mytitle}
}
}
\newcommand{\mytitle}{\GetTranslationPDF{test}}
\begin{document}
\tableofcontents
\section{\GetTranslationPDF{test}}
\end{document}