acmart:\protect 的问题

acmart:\protect 的问题

我正在使用最近的艾克玛特包,并希望将数学字符放入几个部分标题中。我知道存在与“脆弱”以及与hyperrefacmart使用)的交互相关的问题,我不太理解;但是通常的\protect咒语不起作用。以下内容无法编译:

\documentclass{acmart}
\newcommand*{\verifiedBy}{\mathrel{\reflectbox{$\models$}}}

\begin{document}
$\verifiedBy$ % ok
\section{$\protect\verifiedBy$} % borks
\end{document}

我收到的信息是:

! Argument of \GPT@temp has an extra }.
<inserted text> 
                \par 
l.7 \section{$\protect\verifiedBy$}

如果我acmart用替换article,并导入graphicx,则\reflectbox一切都很好:

\documentclass{article}
\usepackage{graphicx} 
\newcommand*{\verifiedBy}{\mathrel{\reflectbox{$\models$}}}

\begin{document}
$\verifiedBy$ % ok
\section{$\protect\verifiedBy$} % also ok
\end{document}

答案1

这里的问题是hyperref不知道如何处理\reflectbox。在这种情况下,应该使用

\texorpdfstring{TeX stuff}{pdf stuff}

第一个参数是要排版的内容TeX,第二个参数输入 pdf 文件的信息。分节命令应该是

\section{Section with \texorpdfstring{$\protect\verifiedBy$}{symbol}}

在这种情况下,打印的部分标题将是您期望的,并且 pdf 阅读器的导航面板将包含“带有符号的部分”。

编辑:根据 egreg 的建议,如果只需要一次,这个解决方案很简单;如果符号可能在移动参数中出现多次,最好使用

\pdfstringdefDisableCommands{\def\verifiedBy{replacement symbol}}

顺便说一句,你的定义\verifiedBy比必要的要复杂得多。查看LaTeX资料来源可以发现,\models定义为

\DeclareRobustCommand{\models}{\mathrel{|}\joinrel\Relbar}

其中\Relbar本质上是\mathrel{=}(但也很稳健),并且\joinrel是负空间。没有反射框,你可以定义

\DeclareRobustCommand{\verifiedBy}{\Relbar\joinrel\mathrel{|}}

将命令声明为健壮的可以省略\protect分段命令的参数。

相关内容