![带有可选参数的 Autoref](https://linux22.com/image/372511/%E5%B8%A6%E6%9C%89%E5%8F%AF%E9%80%89%E5%8F%82%E6%95%B0%E7%9A%84%20Autoref.png)
我一直想做的是使用\autoref
可选参数,类似于经常使用的\cite
:我希望能够写入\autoref[comment]{label}
,以在最终的 pdf 中获得 [标签链接,注释]。有什么方法可以做到这一点(特别是使用 autoref,而不是其他引用包/命令)?感谢您的帮助。
答案1
请参阅以下三个不同版本(由于 OP 的变更请求)
有了xparse
它,重新定义一些命令就非常容易了,只要原始版本\autoref
也存储起来,这需要\LetLtxMacro
来自letltxmacro
包。
由于\autoref
有一个带星号的版本,\autoref*
因此也必须捕获该版本。
\RenewDocumentCommand{\autoref}{som}{...}
重新定义\autoref
并提供带星号的第一个参数(s)、可选的(o)第二个参数(用于注释)和强制的(m)第三个参数(用于标签名称)。
可以通过\IfBooleanTF{#1}{}{}
调用带星号的版本进行检查,也\IfValueTF{#2}{}{}
可以通过指定可选参数进行检查。
请注意,评论未包含在超链接框/框架中!如果需要,则需要做更多工作。
\documentclass{article}
\usepackage{hyperref}
\usepackage{letltxmacro}
\usepackage{xparse}
\AtBeginDocument{%
\LetLtxMacro\autoreforig\autoref
\RenewDocumentCommand{\autoref}{som}{%
\IfBooleanTF{#1}{%
\autoreforig*{#3}\IfValueT{#2}{#2}%
}{%
\autoreforig{#3}\IfValueT{#2}{#2}%
}%
}
}
\begin{document}
See \autoref[ is very nice]{section:foo} or \autoref*[ is nice too]{section:foobar}
\section{Foo section}\label{section:foo}
\section{Foo bar section}\label{section:foobar}
\end{document}
使用方括号更新
\documentclass{article}
\usepackage{hyperref}
\usepackage{letltxmacro}
\usepackage{xparse}
\AtBeginDocument{%
\LetLtxMacro\autoreforig\autoref
\RenewDocumentCommand{\autoref}{som}{%
[%
\IfBooleanTF{#1}{%
\autoreforig*{#3}%
}{%
\autoreforig{#3}%
}%
\IfValueT{#2}{,\space#2}]%
}
}
\begin{document}
See \autoref[is very nice]{section:foo} or \autoref*[is nice too]{section:foobar}
\section{Foo section}\label{section:foo}
\section{Foo bar section}\label{section:foobar}
\end{document}
第三部分:
\documentclass{article}
\usepackage{hyperref}
\usepackage{letltxmacro}
\usepackage{xparse}
\AtBeginDocument{%
\LetLtxMacro\autoreforig\autoref
\RenewDocumentCommand{\autoref}{som}{%
\IfValueT{#2}{[}%
\IfBooleanTF{#1}{%
\autoreforig*{#3}%
}{%
\autoreforig{#3}%
}%
\IfValueT{#2}{,\space#2]}%
}
}
\begin{document}
See \autoref[is very nice]{section:foo} or \autoref*[is nice too]{section:foobar}, but \autoref{section:foo} or \autoref*{section:foobar} are without comment.
\section{Foo section}\label{section:foo}
\section{Foo bar section}\label{section:foobar}
\end{document}
答案2
从 TeXlive 2023 等开始,针对新 LaTeX 的更新解决方案:
\AtBeginDocument{%
\NewCommandCopy\autoreforig\autoref
\RenewDocumentCommand{\autoref}{som}{%
\IfBooleanF{#1}{%
\hyperref[#3]%
}{%
\autoreforig*{#3}\IfValueT{#2}{\nobreak}\xspace\IfValueT{#2}{#2}%
}%
}
}
感谢 Ulrike Fischer 和 David Carlisle 的快速回复!