软件包 hyperref 警告:PDF 字符串中不允许使用令牌。在目录中使用来自 CSV 的值

软件包 hyperref 警告:PDF 字符串中不允许使用令牌。在目录中使用来自 CSV 的值

我用它datatool来读取csv文件并从中获取值。我还想在章节名称中使用这些值。我对TOC和页面没有问题。我可以从我的 csv 文件中看到值。但bookmarkscreate by hyperref(我认为)只有PK/indexes,但没有来自 csv 文件的值。

此外我还收到以下警告:Package hyperref Warning: Token not allowed in a PDF string.

我的 csv 文件中的值只有 A-Za-z0-9 字母,而没有类似的特殊 Unicode 符号\sqrt

这是可以显示该问题的示例代码。

%&xelatex
% !TEX program = xelatex
\documentclass{book}

\usepackage{polyglossia}
\usepackage{fontspec}
\usepackage{noto-mono} % to support hyperref package
\usepackage{amsmath,amsthm,amssymb,mathrsfs,amsfonts,dsfont}
\usepackage{hyperref}
\hypersetup{
    colorlinks=true,
    linkcolor=blue,
    filecolor=magenta,
    urlcolor=blue,
}

\usepackage{datatool}

\author{Some}
\title{Any}

\begin{filecontents*}{data.csv}
PK,Value
1,Val1
2,Val2
\end{filecontents*}

\DTLloaddb{values}{data.csv}

\ExplSyntaxOn
\NewDocumentCommand{\getValue}{m}{\DTLfetch{values}{PK}{#1}{Value}}
\ExplSyntaxOff


\begin{document}

\frontmatter
\tableofcontents

\mainmatter


\chapter{AAA \getValue{1}}
\chapter{BBB \getValue{2}}


\end{document}

答案1

您的 \getValue 命令不可扩展,并且 \DTLfetch 也不可扩展(大多数数据工具命令都不可扩展)。您需要以一种可扩展的方式存储数据,以便可以检索它们。

\documentclass{book}


\usepackage{hyperref}
\hypersetup{
    colorlinks=true,
    linkcolor=blue,
    filecolor=magenta,
    urlcolor=blue,
}

\usepackage{datatool}

\author{Some}
\title{Any}

\begin{filecontents*}[force]{data.csv}
PK,Value
1,Val1
2,Val2
\end{filecontents*}

\DTLloaddb{values}{data.csv}


\ExplSyntaxOn
\prop_new:N\g_sergei_data_prop 
\NewDocumentCommand{\storeValue}{mm}{\prop_gput:NVV\g_sergei_data_prop#1#2}
\NewExpandableDocumentCommand{\getValue}{m}{\prop_item:Nn\g_sergei_data_prop{#1}}
\ExplSyntaxOff

\DTLforeach{values}{\mynum=PK,\myval=Value}{\storeValue\mynum\myval}

\begin{document}

\frontmatter
\tableofcontents

\mainmatter


\chapter{AAA \getValue{1}}
\chapter{BBB \getValue{2}}


\end{document}

(prop 是否是正确的数据容器取决于你的实际使用情况)

相关内容