我有一个 LaTeX 环境,它通过宏来操作节名称,\sectionname
然后最终通过 创建节\section{\sectionname}}
。问题是,当这个宏被覆盖时,\nameref
它似乎在调用时使用了宏值,而不是宏的内容。我相信这是一个关于扩展的问题,即\nameref
试图按字面意思调用\sectionname
,而不是当前的文字标签\section
;但无论我尝试使用\expandafter
或\edef
放置什么,我都没有足够的理解来让它工作。
这是 MWE
\documentclass{article}
\usepackage{hyperref}
\begin{document}
\def\sectionname{First Section}
\section{\sectionname}\label{sec:mysection}
\def\sectionname{Second section}
\section{\sectionname}
I'm trying to cite ``First Section'', but I'm really citing:
\nameref{sec:mysection}
\end{document}
答案1
nameref
使用包 gettitlestring 来存储标题。默认情况下,这不会扩展文本,但您可以更改这一点。请注意,虽然这会提供命令的内容,但如果标题的内容包含脆弱的命令,它也会中断,因此您应该保护它们
\documentclass{article}
\usepackage{hyperref}
\AtBeginDocument{\GetTitleStringSetup{expand}}
\begin{document}
\def\sectionname{First Section}
\section{\sectionname}\label{sec:mysection}
\def\sectionname{Second section}
\section{\sectionname}
I'm trying to cite ``First Section'', but I'm really citing:
\nameref{sec:mysection}
\end{document}
答案2
\sectionname
也许用 的顶层扩展 的正则表达式替换\sectionname
可以达到这样的效果:
\ExplSyntaxOn
\tl_new:N \l__expcmd_itchy_tl
\tl_new:N \l__expcmd_scratchy_tl
\cs_new_protected:Npn \expandcommand #1 #2 {
\tl_set:No \l__expcmd_itchy_tl {#1}
\tl_set:Nn \l__expcmd_scratchy_tl {#2}
\exp_args:Nnf \use:n {\regex_replace_all:nnN} {
\exp_args:Nno \use:n
{ \exp_args:Nno \use:n {(\c } }
{ \cs_to_str:N #1 })+
}{\u{l__expcmd_itchy_tl}} \l__expcmd_scratchy_tl
\l__expcmd_scratchy_tl
}
\ExplSyntaxOff
\documentclass{article}
\usepackage{hyperref}
\begin{document}
\def\sectionname{First Section}
\expandcommand{\sectionname}{\section{bla \sectionname\space bla}}\label{sec:mysection}
\def\sectionname{Second section}
\expandcommand{\sectionname}{\section{blu \sectionname\space blu}}
I'm trying to cite ``bla First Section bla'', and I'm really citing:
\nameref{sec:mysection}
\end{document}