带星号版本的宏的 PDF 纯文本

带星号版本的宏的 PDF 纯文本

我正在使用 PDFLaTeX 排版文档。在某些章节标题中,我使用了一个带有星号版本的宏。在 PDF 索引(PDF 查看器通常在侧窗格中显示的目录)中,我获取了宏的参数,显示该宏已在某处被删除。碰巧的是,我希望将宏的第二个参数作为降级的纯文本(无论宏调用是否带有星号)。

也就是说,我写

\section{\foo{one}{two}}

我希望它有点像

\section[two]{\foo{one}{two}}

除了目录仍然应该有\foo{one}{two}并且我希望它是自动的,我不想在我使用宏的每个部分标题中都做不同的事情。

在我看来,这似乎是 的一个案例\texorpdfstring。但我该如何去掉星号呢?LaTeX 抱怨\@ifnextchar最终会变成 PDF 字符串,这是有道理的,因为这就是可扩展性停止的地方。我怎样才能以可扩展的方式去掉星号,或者无论如何才能做到这一点?

说明问题的玩具示例:

\documentclass{article}
\usepackage[english]{babel}
\usepackage{xr-hyper}
\usepackage[destlabel=true]{hyperref}
\makeatletter
\def\foo@star#1#2{\textsf{#1}-{#2}}
\def\foo@plain#1#2{\textit{#1}-{#2}}
\DeclareRobustCommand{\foo}{\@ifstar\foo@star\foo@plain}
\def\foo@pdf#1#2{#2}
\DeclareRobustCommand{\goo}{\texorpdfstring{\@ifstar\foo@star\foo@plain}{\@ifstar\foo@pdf\foo@pdf}}
\DeclareRobustCommand{\hoo}{\texorpdfstring{\@ifstar\foo@star\foo@plain}{\foo@pdf}}
\makeatother
\begin{document}
\section{\foo{plain}{direct}}
\section{\foo*{starred}{direct}}
\section{\goo{plain}{texorpdfstring+ifstar}}
\section{\goo*{starred}{texorpdfstring+ifstar}}
\section{\hoo{plain}{texorpdfstring}}
\section{\hoo*{starred}{texorpdfstring}}
\end{document}

\foo是基本版本,不考虑 PDF 字符串。是我希望能够起作用的,但由于不是完全可扩展的\goo所以不起作用。适用于无星号版本,但当有星号时不会吃掉星号。\@ifstar\hoo

LaTeX 的警告:

Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref)                removing `\@ifnextchar' on input line 14.


Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref)                removing `\@ifnextchar' on input line 15.


Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref)                removing `\@ifnextchar' on input line 16.


Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref)                removing `\@ifnextchar' on input line 17.

PDF索引:

plaindirect
*starreddirect
plaintexorpdfstring+ifstar
*starredtexorpdfstring+ifstar
texorpdfstring
starredtexorpdfstring

我想要的只是第二个参数,没有第一个参数,也没有星星。

答案1

我想这就是你想要的:

\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}

\DeclareExpandableDocumentCommand{\foo}{smm}{%
  \texorpdfstring
    {\IfBooleanTF{#1}{\textsf}{\textit}{#2}--#3}
    {#2-#3}%
}

\begin{document}

\section{This is \foo{A}{B}}

\section{This is \foo*{A}{B}}

\end{document}

在此处输入图片描述

答案2

您所需要的只是 \string。

\documentclass{article}
\usepackage[english]{babel}
\usepackage{xr-hyper}
\usepackage[destlabel=true]{hyperref}
\makeatletter
\newcommand{\foo@star}[2]{\textsf{#1}-{#2}}
\newcommand{\foo@plain}[2]{\textit{#1}-{#2}}
\DeclareRobustCommand{\foo}{\@ifstar\foo@star\foo@plain}
\makeatother

\newcommand{\mysection}[1]{\section[\string #1]{#1}}

\begin{document}
\tableofcontents

\mysection{\foo{plain}{direct}}
\mysection{\foo*{starred}{direct}}

\end{document}

演示

相关内容