![生成特定标签的段落和页码列表](https://linux22.com/image/377061/%E7%94%9F%E6%88%90%E7%89%B9%E5%AE%9A%E6%A0%87%E7%AD%BE%E7%9A%84%E6%AE%B5%E8%90%BD%E5%92%8C%E9%A1%B5%E7%A0%81%E5%88%97%E8%A1%A8.png)
我想知道是否有人可以帮助我解决这个问题:
我有一份报告,我显示了其段落编号。段落编号随后用作标签的一部分,以便我稍后可以提取它,并且我有标准标签名称,例如 sci1、sci2、clin1 等。
我需要生成一个列表,列出每个标签单独出现的段落和页码(见图)。我可以手动完成,但我的报告很大,所以我想知道我是否可以编写一个宏来“自动”完成它,因为我已经标准化了标签。
我浏览了互联网以寻找解决方案,并尝试使用和修改代码所有带超链接的标签列表 不幸的是没有运气。
我对 Latex 还很陌生,因此欢迎任何建议、更正或其他内容 :)
梅威瑟:
\documentclass{article}
\usepackage{hyperref}
\usepackage{xstring}
\usepackage{blindtext}
\newcounter{par}
\newenvironment{pns}{\everypar={\refstepcounter{par}\makebox[0pt]{\makebox[15ex][l]{\arabic{par}}}}}
\long\def\findlabel#1#2\findlabel{\ifx\newlabel#1\complist\expandafter{\the\complist\showlabel#2}\fi}
\def\showlabel#1#2{\S\texttt{\ref{#1}~(p.\pageref{#1})}}
\newtoks\complist
\newread\zz
\immediate\openin\zz=\jobname.aux
\loop
\ifeof\zz\else
\read\zz to \tmp
\expandafter\findlabel\tmp\relax\findlabel
\repeat
\begin{document}
\section{Text}
\begin{pns}
\blindtext\label{sci1:1}
\blindtext\label{sci2:1}
\end{pns}
\subsection{other}
\begin{pns}
\blindtext[2]\label{sci1:2}
\blindtext
\blindtext\label{clin1:1}
\end{pns}
\section*{Labels}
This is the list of all labels:
\the\complist
\vspace{12pt}
And this is what I would like it to look like:
\vspace{12pt}
\begin{tabular}{r|l}
Sci1 & \S\ref{sci1:1} (p.\pageref{sci1:1}), \S\ref{sci1:2} (p.\pageref{sci1:2}) \\
Sci2 & \S\ref{sci2:1} (p.\pageref{sci2:1})\\
Clin1 & \S\ref{clin1:1} (p.\pageref{clin1:1})\\
\end{tabular}
\end{document}
答案1
这部分满足了您的要求。我没有尝试将其转换sci1:1
为列表Sci1
或将其合并sci1:1
为sci1:2
列表。该xstring
包可以执行此类操作。
我认为你真正需要的只是一份所有标签名称的列表。有了它,你就可以搜索和格式化几乎任何东西。
您可以将列表构建为宏、标记甚至保存框。宏的问题在于您需要使用\edef
或\xdef
将新项目添加到列表中,并且\ref
和\pageref
不可扩展。保存框使用\unvbox
或\unhbox
并且已提前完全格式化(无表格)。
\documentclass{article}
\usepackage{hyperref}
\usepackage{xstring}
\usepackage{blindtext}
\newcounter{par}
\newenvironment{pns}{\everypar={\refstepcounter{par}\makebox[0pt]{\makebox[15ex][l]{\arabic{par}}}}}
\newcommand{\showlabel}[1]{#1&\S\texttt{\ref{#1}}&\texttt{(p.\pageref{#1})}\\}
\newtoks\complist
\let\XXXnewlabel=\newlabel% \oldlabel and \oldnewlabel already used
\renewcommand{\newlabel}[2]{% #1=label, #2=\r@label arguments
\XXXnewlabel{#1}{#2}%
\global\complist\expandafter{\the\complist\expandafter\showlabel{#1}}
}
\begin{document}
\section{Text}
\begin{pns}
\blindtext\label{sci1:1}
\blindtext\label{sci2:1}
\end{pns}
\subsection{other}
\begin{pns}
\blindtext[2]\label{sci1:2}
\blindtext
\blindtext\label{clin1:1}
\end{pns}
\section*{Labels}
This is the list of all labels:
\begin{tabular}{r|rl}
\the\complist
\end{tabular}
\vspace{12pt}
And this is what I would like it to look like:
\vspace{12pt}
\begin{tabular}{r|l}
Sci1 & \S\ref{sci1:1} (p.\pageref{sci1:1}), \S\ref{sci1:2} (p.\pageref{sci1:2}) \\
Sci2 & \S\ref{sci2:1} (p.\pageref{sci2:1})\\
Clin1 & \S\ref{clin1:1} (p.\pageref{clin1:1})\\
\end{tabular}
\end{document}