![使用零件号和车架号创建参考](https://linux22.com/image/289994/%E4%BD%BF%E7%94%A8%E9%9B%B6%E4%BB%B6%E5%8F%B7%E5%92%8C%E8%BD%A6%E6%9E%B6%E5%8F%B7%E5%88%9B%E5%BB%BA%E5%8F%82%E8%80%83.png)
我创建了一个 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}