这是代码(这只是一个例子,我的真实情况更大,我有两个命令\foo
,\print
我需要前者用一个可选参数调用后者):
\documentclass{article}
\usepackage{hyperref}
\newcommand\print[2][bar]{#2}
\newcommand\foo{\print{world}}
\begin{document}
\section{Hello \foo!}
\end{document}
它给了我以下警告:
Package hyperref Warning: Token not allowed in a PDF string (Unicode):
(hyperref) removing `\print' on input line 6.
哪里出了问题?我该如何修复?在我的实际情况下,打印内容的决定是由 做出的\print
,因此我无法\texorpdfstring
在 内部使用\foo
。
这是我的真实情况。首先,有\anon
命令里面acmart.cls
:
\newcommand{\anon}[2][ANONYMIZED]{%
\if@ACM@anonymous%
{\color{ACMOrange}#1}%
\else%
#2%
\fi}
然后我有自己的\eolang
命令里面eolang.sty
:
\newcommand\eolang{%
\ifdefined\anon%
\anon[XYZ]{{\sffamily EO}}%
\else%
{\sffamily EO}%
\fi%
}
最后,我这样做:
\documentclass[anonymous]{acmart}
\usepackage{eolang}
\begin{document}
\section{Hello \eolang!}
\end{document}
我收到了警告。
答案1
\anon
修复(以完全兼容的方式)的定义。
\documentclass[anonymous]{acmart}
%\usepackage{eolang}
% just the relevant macro from eolang.sty
\makeatletter
\newcommand\eolang{%
\ifdefined\anon
\anon[XYZ]{\textsf{EO}}%
\else
\textsf{EO}%
\fi
}
\makeatother
% end of excerpt from eolang.sty
% Fix \anon to be expandable
\makeatletter
\NewDocumentCommand{\ACM@orange}{m}{\textcolor{ACMOrange}{#1}}
\pdfstringdefDisableCommands{\let\ACM@orange\@firstofone}
\RenewExpandableDocumentCommand{\anon}{O{ANONYMIZED}m}{%
\if@ACM@anonymous
\ACM@orange{#1}%
\else
#2%
\fi
}
\makeatother
\begin{document}
\section{Hello \eolang!}
\end{document}
删除该anonymous
选项将