生成特定标签的段落和页码列表

生成特定标签的段落和页码列表

我想知道是否有人可以帮助我解决这个问题:

我有一份报告,我显示了其段落编号。段落编号随后用作标签的一部分,以便我稍后可以提取它,并且我有标准标签名称,例如 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:1sci1: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}

演示

相关内容