我正在使用最近的艾克玛特包,并希望将数学字符放入几个部分标题中。我知道存在与“脆弱”以及与hyperref
(acmart
使用)的交互相关的问题,我不太理解;但是通常的\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
分段命令的参数。