节名称的宏影响 nameref

节名称的宏影响 nameref

我有一个 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}

MWE 的输出

答案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}

在此处输入图片描述

相关内容