使用 \newcommand 和 \write\@auxout

使用 \newcommand 和 \write\@auxout

我读了一些相关文章,但仍然无法解决问题

     \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}}

相关内容