很抱歉再次以类似的帖子标题回来(我曾经有一篇同名的帖子,后来改名为PDF 元数据 - 从命令中提取(排版)“纯文本”的宏?)——但我希望现在问题可以缩小一点……
假设你有类似的东西
\def\mystring{Test of math $a^{b}$, \textbf{bold} and some {\color{lightgray}coloring}}
我想使用/了解一个宏,它可以接受\mystring
并返回它的“纯”文本版本。我对删除数学运算非常满意 - 但是,我希望删除字母,否则我会排版文本。假设我们调用这样的宏\getPlainText
- 那么我会对行为如下的东西非常满意:
* \typeout{ \getPlainText{\mystring} }
Test of math , bold and some coloring
基本上,我认为我可以通过几种方式使用它(但主要是为了回应hyperref
一些东西):
在 PDF 元数据中
在hyperref - PDF 元数据 - 从命令中提取(排版)“纯文本”的宏?,正确显示“latexed”PDF元数据的答案是使用\texorpdfstring
如下方法:
\newcommand{\myauthors}{Author 1 \\ Author 2 \\ \texorpdfstring{\color{lightgray}Author 3}{Author 3}}
...
\hypersetup{..., pdfauthor=\myauthors, ...}
在这里,我更喜欢使用“getPlainText”的语法,如下所示:
\newcommand{\myauthors}{Author 1 \\ Author 2 \\ {\color{lightgray}Author 3}}
...
\hypersetup{..., pdfauthor=\texorpdfstring{\myauthors}{\getPlainText{\myauthors}}, ...}
在 PDF TOC 书签中,与带有数学的章节标题相关的内容
在mathmode - 章节标题中的方程式,避免分段数学问题(导致hyperref
阻塞)的答案再次是使用\texorpdfstring
- 如下所示:
\section{The values of \texorpdfstring{$\beta$}{TEXT} %
for which values are defined}
在这里我更愿意在序言中使用类似这样的内容:
\makeatletter
\let\oldsection\section
\renewcommand{\section}{\@ifstar
\mysectionStar%
\mysectionNoStar%
}
\newcommand{\mysectionStar}[1]{ % no two arguments here?
\typeout{AAAA}% debug
\oldsection{#1}}
\newcommand{\mysectionNoStar}[1]{ %
\typeout{BBBB}% debug
\oldsection[\getPlainText{#1}]{#1} }
\makeatother
...并避免必须手动将\texorpdfstring
s 添加到所有部分..
那么,那里有类似的东西吗?
答案1
我不完全明白您在这里的意思——为什么您想要在目录中使用章节标题的纯文本版本?
而且自动生成的书签hyperref
已经是纯文本了不是吗?
您有书签生成出错的具体示例吗?那么也许应该特别看看这个!
也就是说,\pdfstring
生成书签文本的宏绝对是您\getPlainText
在 TeX 内部能获得的最近的宏。
让我们用你的例子来实验一下:
\documentclass{article}
\usepackage{color}
\usepackage{hyperref}
\def\mystring{Test of math $a^{b}$, \textbf{bold} and some {\color{lightgray}coloring}}
\pdfstringdef\myplainstring{\mystring}
\typeout{"\myplainstring"}
这将产生输出
Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref) removing `math shift' on input line 11.
Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref) removing `superscript' on input line 11.
Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref) removing `math shift' on input line 11.
Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref) removing `\@ifnextchar' on input line 11.
"Test of math ab, bold and some lightgraycoloring"
您会发现它处理数学相当不错,但有点失误,\color
因为颜色正在寻找一个\@ifnextchar
不可扩展的可选参数。这是因为\color
没有明确处理\pdfstringdef
。
但是,您可以添加这样的显式处理程序:
\pdfstringdefDisableCommands{\def\color#1{}}
您可以多次调用此函数来“声明”其他命令的其他特殊处理程序,也可以一次声明多个内容。但是,存储的每个定义\pdfstringdefDisableCommands
都在之前执行\pdfstringdef
,因此现在我们得到
Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref) removing `math shift' on input line 11.
Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref) removing `superscript' on input line 11.
Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref) removing `math shift' on input line 11.
"Test of math ab, bold and some coloring"
由于\color
现在有一个可扩展的定义,它可以被干净地转换。
总的来说,这仍然意味着需要进行一些手动工作来“修复”您在章节标题中使用的所有命令,但至少您不需要用 来弄乱章节本身\texorpdfstring
。
我认为在 TeX 中根本不可能存在更通用的解决方案,因为几乎不可能编写一个元解释器在 TeX 中。