引用具有宏生成名称的部分

引用具有宏生成名称的部分

我的论文中有很多名为“示例 XY”的小节,我想使用宏来生成这些小节的名称和标签。

目标是能够参考如下图所示的示例:

目标

使用该nameref包我尝试了以下操作:

\documentclass[10pt,a4paper]{report}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{nameref}

\newcommand{\example}{\subsection{Example \arabic{section}.\arabic{subsection} }\label{ex:\arabic{section}-\arabic{subsection}}}

\begin{document}

\chapter{Simulations}
\section{Examples 1}
\example
\example
\nameref{ex:1-2} has the same solution as \nameref{ex:1-1}.

\end{document}

然而,这给了我文本“示例 1.2 具有与示例 1.2 相同的解决方案”。

我怀疑该引用是否按预期工作,但是在替换小节的名称时Example \arabic{section}.\arabic{subsection}再次调用,结果只给我当前示例/小节的名称。

有没有办法用宏来生成子部分和标签,还是我必须手动完成?

答案1

您必须先扩展子节标题,然后才能将其写入辅助文件。您无法控制它的写入,因此您可以在调用子节之前扩展它。当然,这意味着\arabic{subsection}将是旧的子节编号,因此您必须增加它:

\documentclass[10pt,a4paper]{report}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{nameref}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_eq:NN \expNx \exp_args:Nx
\ExplSyntaxOff

\newcommand\arabicPlusOne[1]{\number\numexpr1+\value{#1}\relax}
\newcommand\example{\expNx\subsection{Example \arabic{section}.\arabicPlusOne{subsection} }\label{ex:\arabic{section}-\arabic{subsection}}}

\begin{document}

\chapter{Simulations}
\section{Examples 1}
\example
\example
\nameref{ex:1-2} has the same solution as \nameref{ex:1-1}.

\end{document}

答案2

目前还不清楚你使用这种方法有什么好处,因为你需要知道分配给每个特定示例的编号,以便\ref{ex:<section>-<subsection>}直接使用

Example~1.2

而不是 \nameref{ex:1-2}` 似乎更容易。

你可以使用象征性的标签,它不依赖于分配的实际数字。

\documentclass[10pt,a4paper]{report}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{nameref}

\newcommand{\example}[1]{%
  \subsection{Example \ref{ex:#1}}%
  \label{ex:#1}%
}
\renewcommand\thesubsection{\arabic{section}.\arabic{subsection}}
\newcommand{\subsectionseccntformat}{\thesection.\arabic{subsection}}
\makeatletter
\renewcommand{\@seccntformat}[1]{%
  \ifcsname #1seccntformat\endcsname
    \csname #1seccntformat\endcsname
  \else
    \csname the#1\endcsname
  \fi
  \quad
}
\makeatother

\begin{document}

\chapter{Simulations}
\section{Examples 1}
\example{first}
\example{second}
\nameref{ex:first} has the same solution as \nameref{ex:second}.

\end{document}

在此处输入图片描述

答案3

这是一个类似的解决方案,不使用 LaTeX3,而是使用\begingroup\def\zzz{\endgroup ...}这是一个类似的解决方案,关于 \begingroup\edef\x{\endgroup。与 Marcel Krüger 的解决方案类似,它使用当前节计数器,将子节计数器增加一,然后将参数完全扩展为\section。具体来说,这意味着节标题应该是可扩展的(\emph例如,是 out)。

\documentclass[10pt,a4paper]{report}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{nameref}

\newcounter{faex@tempa}
\newcommand{\example}{%
  \setcounter{faex@tempa}{\value{subsection}}%
  \stepcounter{faex@tempa}%
  \begingroup
  \edef\zzz{\endgroup
    \noexpand\subsection{Example \arabic{section}.\arabic{faex@tempa}}}%
  \zzz
  \label{ex:\arabic{section}-\arabic{subsection}}}


\begin{document}
\chapter{Simulations}
\section{Examples 1}
\example
\example
\nameref{ex:1-2} has the same solution as \nameref{ex:1-1}.
\end{document}

相关内容