我的论文中有很多名为“示例 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}