如果我有一个\section
,其名称包含一个宏,如果我尝试通过\nameref
包含的宏引用该部分,则似乎在的点\nameref
而不是的点处展开\section
。
我确信我知道为什么会发生错误的事情,但我似乎无法弄清楚如何让正确的事情发生。
我该如何让它正常工作? 有可能让它正常工作吗?
最小示例
\documentclass[12pt]{article}
\usepackage{nameref}
\begin{document}
\begin{empty}
\newcommand{\foo}{Foo}
\section{\foo}... %%%% Shows up as Foo (correct)
\label{XYZZY}
\paragraph{Good} \nameref{XYZZY} %%%%% Gives Foo (correct)
\end{empty}
\begin{empty}
\newcommand{\foo}{Bar}
\paragraph{Bad} \nameref{XYZZY} %%%%% Gives Bar (incorrect)
\end{empty}
% \paragraph{Ugly} \nameref{XYZZY} %%% Gives "Undefined control sequence" error message.
\end{document}
答案1
如果尚未加载,则包名称引用加载包获取标题字符串它提供了从分段命令的参数中提取相关分段的标题并\label
通过内部宏将该标题提供给命令的功能\@currentlabelname
。
如果获取标题字符串已加载选项expand
(这不是默认的,但可以通过触发,例如,通过),然后在提取标题并通过(重新)定义使其可用于命令的过程\PassOptionsToPackage
中,事情会通过扩展。\protected@edef
\label
\@currentlabelnane
\documentclass[12pt]{article}
\PassOptionsToPackage{expand}{gettitlestring}% Have title-phrases referenceable via \nameref expanded
% by means of \protected@edef while preparing \@currentlabelname
% which in turn is used by the command \label when writing
% cross-referencing-data to the corresponding \newlabel-entry
% in the aux-file.
\usepackage{nameref}
\begin{document}
\begin{empty}
\newcommand{\foo}{Foo}
\section{\foo}... %%%% Gives Foo (correct)
\label{XYZZY}
\paragraph{Good} \nameref{XYZZY} %%%%% Gives Foo (correct)
\end{empty}
\begin{empty}
\newcommand{\foo}{Bar}
\paragraph{Not bad} \nameref{XYZZY} %%%%% Gives Foo (correct)
\end{empty}
\paragraph{Not ugly} \nameref{XYZZY} %%% Gives Foo (correct)
\end{document}
如果获取标题字符串没有使用选项 加载expand
,则辅助文件包含以下\newlabel
-entry:
\newlabel{XYZZY}{{1}{1}{\foo }{}{}}
,其中内容未展开,因此在通过 交叉引用标签时会展开\nameref
。
如果获取标题字符串使用选项加载expand
,则辅助文件包含以下\newlabel
条目:
\newlabel{XYZZY}{{1}{1}{Foo}{}{}}
,其中的内容在以下情况下得到扩展:获取标题字符串准备/提供数据以供\nameref
参考。
关于标题字符串的稳健性/扩展的一些评论可以在nameref 软件包手册第 3 节。