有没有一种简单的方法可以向文档的某个部分添加多个属性/特性?例如,我想为某个小节中讨论的产品添加某种评级。
例子:
\section{Product A}
\label{sec:proda}
\rating{10}
稍后,我想在一个大表中列出所有产品及其评级,包括指向产品描述所在部分的超链接。因此,最好使用该部分的标签来访问评级:
\nameref{sec:proda} (\ref{sec:proda) & \ratingref{sec:proda}
是否存在一个不太复杂的解决方案可以实现这样的事情?
答案1
zref
提供了创建可引用的属性列表的方法,从而扩展了默认\label
系统\ref
以包含不仅仅是最后一个标签和页码的内容。
下面提供了一种解决方案,界面略有改变:
\documentclass{article}
\usepackage{zref,zref-titleref}
\usepackage{hyperref}
\makeatletter
\zref@newprop{section}[0]{\thesection}% New reference property
\zref@newprop{rating}[0]{\therating}% New reference property
%\zref@newprop{default}[]{..}% Already defined by zref
%\zref@newprop{title}[]{..}% Already defined by zref
%\zref@newprop{page}[]{..}% Already defined by zref
\zref@newlist{product}% Create a new list of properties
\zref@addprops{product}{default,section,rating,title,page}
\newcommand{\productlabel}[1]{% Label product
\label{#1}% For hyperref
\zref@labelbylist{#1}{product}}% For zref
\newcommand{\rating}[1]{\zref@setcurrent{rating}{#1}}
\newcommand{\productref}[2][default]{\hyperref[#2]{\zref@extract{#2}{#1}}}
\makeatother
\begin{document}
\section{Product A}
\rating{10}
\productlabel{sec:proda}
See \productref[title]{sec:proda} (\productref[section]{sec:proda} \& \productref[rating]{sec:proda}).
\end{document}
对于每件产品,创建一个\productlabel{<label>}
用于存储title
(的\section
)、section
编号或default
、rating
(由 设置的\productrating{<rating>}
)和page
编号的 。您可以使用 引用这些\productref[<type>]{<label>}
。
它兼容hyperref
正如预期的那样(相同的包作者)。
答案2
这里我引入了\ratedsection{<title>}{<label>}{<rating>}
和\showrating{<label>}
,以及所要求的\nameref
和的形式\ratingref
。宏旨在一次性\showrating
构建一行数据。tabular
显然,可以\ratedsubsection
根据需要定义等。
已编辑,将hyperref
包添加到序言中。
重新编辑以支持tabular
建设。
\documentclass{article}
\usepackage{hyperref}
\newcommand\ratedsection[3]{\section{#1}\label{#2}%
\expandafter\def\csname product#2\endcsname{#1}%
\expandafter\def\csname rating#2\endcsname{#3}%
}
\newcommand\showrating[1]{%
\nameref{#1}& \ratingref{#1} &\ref{#1}%
}
\newcommand\nameref[1]{\csname product#1\endcsname}
\newcommand\ratingref[1]{\csname rating#1\endcsname}
\begin{document}
\ratedsection{Product A}{sec:proda}{10}
blah
\ratedsection{Product B}{sec:prodb}{15}
more blah
\section{conclusions}
\begin{table}[ht]
\renewcommand\arraystretch{1.2}
\centering
\caption{Products and their ratings}
\begin{tabular}{lrr}
Product Name & Rating & Section\\
\hline
\showrating{sec:proda}\\
\showrating{sec:prodb}
\end{tabular}
\end{table}
\end{document}