我正在使用 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
答案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}