来自翻译 \GetTranslation 的 PDF 元数据产生了错误的字符编码?

来自翻译 \GetTranslation 的 PDF 元数据产生了错误的字符编码?

在编写我自己的课程时,我使用包\GetTranslationtranslations允许使用不同的语言并\hypersetup设置hyperrefPDF 元数据。

如果我\GetTranslation在文档中使用,utf8 特殊字符会被正确编码。但是,如果我将其用于\GetTranslationPDF 元数据,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}

相关内容