主要问题:有没有办法生成包含带标签子节的节的标题?例如,考虑包含节的文档\section{A}\subsection{1}\label{1}
。使用 hyperref 包,\nameref*{1}
输出“1”。有没有办法定义\supernameref*{1}
输出“A”而不具体引用节的标签?
动机:假设我有一个 LaTeXed 文档,它作为个人通信记录,其中部分由发件人命名,子部分引用特定通信。使用自定义命令,每个部分都会自动按其编号标记,然后为了方便使用,可以添加额外的静态标签。此类文档的一个小示例(无自定义命令)如下。
\documentclass{book}
\usepackage{hyperref}
\begin{document}
\chapter{Letters}
\section{John Doe}\label{1.1}
\subsection{Dec. 1, 2015}\label{1.1.1} \label{JD1}
Hello. Goodbye.
\section{Jane Doe}\label{1.2}
\subsection{Dec. 2, 2015}\label{1.2.1} \label{JD2}
Goodbye. Hello.
\chapter{Notes}
In \nameref*{1.1.1}, John says hello before goodbye. However, in \nameref*{1.2.1},
Jane does the opposite!
\end{document}
这将在注释章节中输出:
2015 年 12 月 1 日,约翰在道别前说了“你好”。然而,2015 年 12 月 2 日,简却做了相反的事!
我想要的是定义一个自定义命令“\letterref”,以便
\letterref{1.1.1}
输出
(John Doe:2015 年 12 月 1 日)
显然,我可以直接引用 1.1,但我觉得我应该能够自动实现它。我想要的解决方案是通过 定义命令(\supernameref{#1}:\nameref*{#1})
,但这以定义\supernameref
函数为前提。
尝试的解决方案:我考虑过一种与自动标记配合使用的方法。也就是说,假设我希望引用用 L 标记的字母 X(例如示例中的 JD1)。那么一种解决方案是使用 L 获取子节编号 SS(例如 1.1.1),截断结尾子字符串 '.d' 以获取节编号 S(例如 1.1),然后使用\nameref*{S}
获取名称(例如\nameref*{1.1}
='John Doe')。但是,我对 TeX 不是很了解,而且我不知道如何在没有 TeX 自动扩展命令参数的情况下实现这一点。我已经弄清楚了(使用 refcount 和 xstring 包)如何获取 S:
\newcommand{\parse}[1]{\StrCount{#1}{.}[\dotnum] \StrBefore[\dotnum]{#1}{.}}
\expandafter\parse{\number\getrefnumber{JD1}}
得出 1.1,但是我不知道如何让 \nameref* 等到 1.1 计算出来后再尝试评估。