使用零件号和车架号创建参考

使用零件号和车架号创建参考

我创建了一个 beamer 主题,它使用部分(用于讲座幻灯片),并使用部分编号和帧编号对幻灯片进行编号。帧编号在每个部分的开头重置。

问题是,当我用创建引用时\ref,只显示帧号。

我怎样才能同时显示零件编号和车架编号?

这是一个简单的例子:

\documentclass{beamer}
\AtBeginPart{\setcounter{framenumber}{0}}
\makeatletter
\newcommand{\slidenumber}
{slide \ifnum\c@part=0
\insertframenumber
\else
\insertpartnumber-\insertframenumber
\fi}
\makeatother
\begin{document}
\frame{\slidenumber, ref: \ref{one-two}}
\frame{\slidenumber}
\part{one}
\frame{\slidenumber}
\frame[label=one-two]{\slidenumber}
\part{two}
\frame{\slidenumber}
\frame{\slidenumber}
\end{document}

此示例在第一张幻灯片上显示“ref: 2”,但我希望它显示“ref: 1-2”。

我想我必须以某种方式重新定义\label和/或\ref,但遗憾的是,这远远超出了我的 TeX/LaTeX 技能。

答案1

这是一个可能的解决方案:

\documentclass{beamer}
\usepackage{etoolbox}

\AtBeginPart{\setcounter{framenumber}{0}}
\makeatletter
\newcommand{\slidenumber}{%
slide \ifnum\c@part=0\relax
  \insertframenumber
\else
  \insertpartnumber-\insertframenumber
\fi}
\def\mynumberwithin#1#2{\@ifundefined{c@#1}{\@nocounterr{#1}}{%
  \@ifundefined{c@#2}{\@nocnterr{#2}}{%
  \@addtoreset{#1}{#2}%
  \toks@\expandafter\expandafter\expandafter{\csname the#1\endcsname}%
  \expandafter\xdef\csname the#1\endcsname
    {\expandafter\noexpand\csname the#2\endcsname
     -\the\toks@}}}}
\pretocmd{\part}{%
\ifnum\c@part=0\relax
  \mynumberwithin{framenumber}{part}
\fi%
}{}{}

\makeatother

\begin{document}

\frame{\slidenumber, ref~\ref{two}, ref~\ref{one-two} and ref~\ref{two-two}}
\frame[label=two]{\slidenumber}

\part{one}
\frame{\slidenumber}
\frame[label=one-two]{\slidenumber}

\part{two}
\frame{\slidenumber}
\frame[label=two-two]{\slidenumber}

\end{document}

显示生成的交叉引用的图像:

在此处输入图片描述

这个想法只是将framenumber计数器设置为计数器的前缀。我使用了与'spart使用的类似机制,但有一个变化,即使用连字符而不是点。在实际使用命令后立即进行此更改,因此对第一部分之前的帧的最终引用将仅产生帧编号。amstex\numberwithin\part

请注意,使用这些设置,就不再需要 \slidenumber 命令,因为现在您只需使用 \theframenumber 即可:

\documentclass{beamer}
\usepackage{etoolbox}

\AtBeginPart{\setcounter{framenumber}{0}}
\makeatletter
\def\mynumberwithin#1#2{\@ifundefined{c@#1}{\@nocounterr{#1}}{%
  \@ifundefined{c@#2}{\@nocnterr{#2}}{%
  \@addtoreset{#1}{#2}%
  \toks@\expandafter\expandafter\expandafter{\csname the#1\endcsname}%
  \expandafter\xdef\csname the#1\endcsname
    {\expandafter\noexpand\csname the#2\endcsname
     -\the\toks@}}}}
\pretocmd{\part}{%
\ifnum\c@part=0\relax
  \mynumberwithin{framenumber}{part}
\fi%
}{}{}

\makeatother

\begin{document}

\frame{\theframenumber, ref~\ref{two}, ref~\ref{one-two} and ref~\ref{two-two}}
\frame[label=two]{\theframenumber}

\part{one}
\frame{\theframenumber}
\frame[label=one-two]{\theframenumber}

\part{two}
\frame{\theframenumber}
\frame[label=two-two]{\theframenumber}

\end{document}

在此处输入图片描述

相关内容