有没有办法在 LaTeX 中的参考文献/表格的标题中添加表格/参考文献的使用情况?
例如:
\begin{table}
\begin{tabular}{ll}
\textbf{Name} & \textbf{Description} \\
Foo & bar \\
Foo & bar
\end{tabular}
\caption{Nice Table. Used on pages [2,3,4].}
\label{tab:table}
\end{table}
我希望“用于第 [2,3,4] 页。”能够自动出现并链接到正确的参考,链接到文档中使用的所有位置\ref{tab:table}
。
有谁知道可以解决这个问题的软件包吗?
答案1
我想提供两种解决方案。第一种无需使用包即可工作hyperref
。第二种解决方案支持超链接。
\documentclass{article}
\usepackage{etoolbox,xstring,xspace}
\makeatletter
\let\origref\ref
\renewcommand*\ref[1]{%
\origref{#1}\xlabel{#1}}
\def\xlabel#1{%
\ifcsdef{siteref@doc@#1}{}{\csgdef{siteref@doc@#1}{,}}%
\@bsphack%
\csxdef{siteref@doc@#1}{\csuse{siteref@doc@#1},\thepage}%
\protected@write\@auxout{}%
{\string\SiteRef{siteref@#1}{\csuse{siteref@doc@#1}}}%
\@esphack%
}
\newrobustcmd*\SiteRef[2]{\csgdef{#1}{#2}}
\newrobustcmd*\xref[1]{%
\ifcsundef{siteref@#1}{%
\@latex@warning@no@line{Label `#1' not defined}
}{%
[\StrGobbleLeft{\csuse{siteref@#1}}{2}]\xspace%
}%
}
\makeatother
\usepackage{lipsum}
\begin{document}
\ref{tab:table}
\lipsum[1]
\begin{table}[!ht]
\begin{tabular}{ll}
\textbf{Name} & \textbf{Description} \\
Foo & bar \\
Foo & bar
\end{tabular}
\caption{Nice Table. Used on pages \xref{tab:table}.}
\label{tab:table}
\end{table}
\lipsum
\ref{tab:table}
\end{document}
修改以配合使用hyperref
\documentclass{article}
\usepackage{etoolbox,xstring,xspace}
\usepackage[colorlinks=true]{hyperref}
\makeatletter
\AtBeginDocument{%
\let\origref\ref
\renewcommand*\ref[1]{%
\origref{#1}\xlabel{#1}}
}
\newrobustcmd*\xlabel[1]{%
\ifcsdef{siteref@doc@#1}{}{\csgdef{siteref@doc@#1}{,}}%
\@bsphack%
\begingroup
\csxdef{siteref@doc@#1}{\csuse{siteref@doc@#1},\thepage}%
\protected@write\@auxout{}%
{\string\SiteRef{siteref@#1}{\csuse{siteref@doc@#1}}}%
\endgroup
\@esphack%
}
\newrobustcmd*\SiteRef[2]{\csgdef{#1}{#2}}
\newrobustcmd*\xref[1]{%
\ifcsundef{siteref@#1}{%
\@latex@warning@no@line{Label `#1' not defined}
}{%
\begingroup
\StrGobbleLeft{\csuse{siteref@#1}}{2}[\@tempa]\relax%
\def\@tempb{}%
\@tempcnta=0\relax%
\@tempcntb=\@ne\relax%
\def\do##1{\advance\@tempcnta\@ne}%
\expandafter\docsvlist\expandafter{\@tempa}%
\def\do##1{%
\ifnum\@tempcntb=\@tempcnta\relax%
\hyperpage{##1}%
\else
\hyperpage{##1},%
\fi%
\advance\@tempcntb\@ne
}%
[\expandafter\docsvlist\expandafter{\@tempa}]\xspace%
\endgroup
}%
}
\makeatother
\usepackage{lipsum}
\begin{document}
\ref{tab:table}
\lipsum[1]
\begin{table}[!ht]
\begin{tabular}{ll}
\textbf{Name} & \textbf{Description} \\
Foo & bar \\
Foo & bar
\end{tabular}
\caption{Nice Table. Used on pages \xref{tab:table}.}
\label{tab:table}
\end{table}
\lipsum
\ref{tab:table}
\end{document}
该包也crossreference
定义了命令\xref
。因此,如果您加载该包,则必须重命名该命令\xref
。
答案2
您可以通过在使用表格的地方放置标签并添加来获取页码\pageref{..}
,但\pageref
它很“脆弱”,因此必须在前面加上\protect
,例如,
Table \ref{tab:table}\label{tabuse:table} used here...
然后在标题中:
\caption{Nice Table. Used on page \protect\pageref{tabuse:table}.}
对于文章来说,一个肮脏的伎俩就是输入一个空的目录行:
\caption[]{Nice Table. Used on page \pageref{tabuse:table}.}