我读了一些相关文章,但仍然无法解决问题
\newcommand{\myLabel}[2]{\makeatletter\write\@auxout{\string\newlabel{#1}{{#2}{\thepage}}}\makeatother}
我想向 .aux 写入一行,稍后将其读取为标签。在第 3.1 节第 11 页上执行时,
\myLabel{Rings}{\thesubsection.2}
会写出
\newlabel{Rings}{{3.1.2}{11}}
我无法完成这项工作。您能否解释一下我做错了什么,并纠正这个问题?
答案1
实际上,使用\label
-\ref
系统更简单(也更好)。它更简单,因为您不必担心如何写入.aux
,它更好,因为它会在正确的时间写入.aux
,因此页面引用是正确的。操作方法如下:
\documentclass{article}
\makeatletter
\newcommand{\myLabel}[2]{%
\def\@currentlabel{#2}% Update label
\label{#1}}% Mark label
\makeatother
\begin{document}
\myLabel{abc}{def}\ref{abc} \par
\section{Lord}
\subsection{of the}
\subsubsection{Rings}
\myLabel{Rings}{\thesubsubsection.2}\ref{Rings}
\end{document}
请注意,\makeatletter
...\makeatother
对必须位于宏定义之外。并且更新\@currentlabel
是正确建立引用所需的唯一操作。.aux
上述 MWE 的文件包含:
\relax
\newlabel{abc}{{def}{1}}
\@writefile{toc}{\contentsline {section}{\numberline {1}Lord}{1}}
\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}of the}{1}}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.1}Rings}{1}}
\newlabel{Rings}{{1.1.1.2}{1}}