\RenewDocumentCommand\t 不适用于包 hyperref

\RenewDocumentCommand\t 不适用于包 hyperref

我想更新命令,这可以通过或\t轻松完成,但如果该定义与 hyperref 一起使用,则会产生错误。如何让我的定义覆盖该定义?这会有什么影响?\RenewDocumentCommand\renewcommandhyperref

\documentclass{article}
\RenewDocumentCommand{\t}{ }{foobar}
% \usepackage{hyperref} % Uncommenting this results in errors.
\begin{document}
\t
\end{document}

PS - 我之所以使用它,\RenewDocumentCommand是因为使用它生成星号变体相对容易。我也需要开发命令的星号变体\t,因此我需要一个可以轻松完成该任务的命令。

答案1

装好后放上hyperref

\usepackage{hyperref}
% ...
\RenewDocumentCommand{\t}{ }{foobar}

导致错误的原因hyperref似乎是因为它定义\t为一个需要参数的平局。这会覆盖您的定义,留下\t抓取\end作为它的参数...这会导致问题。

我建议使用比更具描述性的内容\t,因为这些速记单字符宏通常保留用于字母/符号上的变音符号。

答案2

在您自己的文档中,您可以根据自己的意愿重新定义命令,但您正在编写一个包,而包必须注意适应 LaTeX 生态系统。您用覆盖现有命令,然后\Renew您会收到 hyperref 错误。两者都应该敲响警钟。

原始 tipa 定义\t如下:

\DeclareTextCommand{\t}{T3}[0]{\@ifstar{\tipaloweraccent[.3ex]{60}}%
  {\tipaupperaccent[-.1ex]{62}}}

因此,它是一个依赖于编码的命令。如果您\t在小文档中尝试,或者检查定义,您会发现 LaTeX 本身只定义了 OML 定义。因此,您可以安全地提供 TU 定义。这可以以与 tipa 类似的方式完成。请注意,hyperref 无法识别书签中的星号,因为这是 tipa 的一项发明,尚未延续(也许无法延续,我没有测试)。

\documentclass{article}
\usepackage{fontspec}
\setmainfont{charissil}
\usepackage{hyperref}

\makeatletter
\newcommand\my@tlowertie[1]{#1^^^^035c}
\newcommand\my@tuppertie[1]{#1^^^^0361}

\DeclareTextCommand{\t}{TU}{\@ifstar{\my@tlowertie}{\my@tuppertie}}
\makeatother
\begin{document}
\section{ \t*a \t a }
 \t*a \t a

\end{document}

在此处输入图片描述

相关内容