自动用 \textunderscore 替换 PDF 字符串的下划线,例如使用 \pdfstringdefDisableCommands

自动用 \textunderscore 替换 PDF 字符串的下划线,例如使用 \pdfstringdefDisableCommands

是否有可能模仿

\section{\texorpdfstring{$x_1$}{x\_1}}

使用\section{$x_1$}\pdfstringdefDisableCommands{...}?我只见过这个答案,它试图做类似的事情,但它不起作用(正如他们承认的那样)。我不太担心警告;我只想x_1出现在 PDF 的书签中,而不是出现\texorpdfstring{...}{...}在每个下划线实例中。


使用@StevenB.Segletes 的第一个解决方案时,tikz 生成的错误的 MWE:

\documentclass{article}
\usepackage{hyperref}

%\usepackage{tikz} % OK

\let\svus_
\catcode`\_=\active
\gdef_{\texorpdfstring{\svus}{\string_}}

%%%    
% pgfmathparser.code.tex
% ! Missing \endcsname inserted.
% <to be read again> 
%                    \svus 
% l.251 ...mnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ}
% \usepackage{tikz}    
%%%

\begin{document}
\tableofcontents

\section{$x_1$}

Document math, $a^3_1$ should be no problem

\section{$y_1$}

Does This\_work?

\end{document}

答案1

回想一下,hyperref 会用类似这样的方式警告你下标字符

Package hyperref Warning: Token not allowed in a PDF string (Unicode):
(hyperref)                removing `subscript' on input line 33.  

因此,hyperref 显然知道它遇到了下标字符。您需要做的就是告诉 hyperref,下次看到时_,您将把该字符放入 pdf 目录中,而不是警告。

下面的代码可以实现这个功能。

\documentclass{article}

\usepackage{tikz}

\usepackage{hyperref}

\makeatletter
\def\subscripttext{subscript}
\def\HyPsd@CatcodeWarning#1{%
  \def\argone{#1}
  \ifx\subscripttext\argone
    \expandafter\def\expandafter\HyPsd@String\expandafter{\HyPsd@String_}%
  \else
    \HyPsd@Warning{%
      Token not allowed in a PDF string (%
      \ifHy@unicode
        Unicode%
      \else
        PDFDocEncoding%
      \fi
      ):%
      \MessageBreak removing `\HyPsd@RemoveCmdPrefix#1'%
    }%
  \fi
}

\begin{document}

\tableofcontents

\section{$x_1$}
    Document math, $a^3_1$ should be no problem
\section{$y_1$}
    Does This\_work?

\end{document}

这种方法允许您不设置 catcode_。只有这么多特殊字符,并且一堆包正在相互竞争定义激活字符的机会。Ti正如您所注意到的,Z 是这方面的专家。

答案2

您可以使下划线数学活跃起来。

你会收到警告

Package hyperref Warning: Token not allowed in a PDF string (Unicode):
(hyperref)                removing `math shift' on input line 17.

但输出将符合预期。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{tikz} % OK
\usepackage{hyperref}
\usepackage{bookmark}


\AtBeginDocument{%
  \begingroup\lccode`~=`_ \lowercase{\endgroup\let~\sb}%
  \mathcode`_="8000
  \catcode`_=12
}


\begin{document}
\tableofcontents

\section{$x_1$}

Document math, $a^3_1$ should be no problem

\section{$y_1$}

This\_works and also_this.

\end{document}

在此处输入图片描述

答案3

这里我采取了_积极措施来实现它。不确定这是否能满足您的需要。

\documentclass{article}
\usepackage{hyperref}
\let\svus_
\catcode`\_=\active
\gdef_{\texorpdfstring{\svus}{\string_}}
\begin{document}
\tableofcontents
\section{$x_1$}

Document math, $a^3_1$ should be no problem

\section{$y_1$}

Does This\_work?

\end{document}

在此处输入图片描述

也许更好的方法是使用\mathcode,这样_就不会激活,但文档里面的 catcode-12 会起作用:

\documentclass{article}
\usepackage{hyperref}
\let\svus_
\mathcode\number`\_="8000
\begingroup\lccode`\~=`\_ \lowercase{\endgroup\def~}%
  {\texorpdfstring{\svus}{\string_}}
\catcode`\_=12
\begin{document}
\tableofcontents
\section{$x_1$}

Document math, $a^3_1$ should be no problem

\section{$y_1$}

Does This\_work?

\end{document}

相关内容