宏从命令中提取(排版)“纯文本”?

宏从命令中提取(排版)“纯文本”?

很抱歉再次以类似的帖子标题回来(我曾经有一篇同名的帖子,后来改名为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

...并避免必须手动将\texorpdfstrings 添加到所有部分..

那么,那里有类似的东西吗?

答案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 中。

相关内容