如何创建标签并在 \newcommand 环境中引用它

如何创建标签并在 \newcommand 环境中引用它

我搜索了好久,但还没有找到解决方案。我正在使用 LaTeX labbook,除了对实验进行“项目”排序之外,我还想添加一个名为“日志”的章节,其中按时间顺序列出了我所做的工作,并引用了进行实验的页面。为此,我创建了 2 个新命令。第一个命令\logg{}{}中,我在第一个参数中添加了日期,在第二个参数中添加了当天我为特定项目所做工作的简短描述。调用第二个命令\showlogg,应按日期对所有日志条目进行排序,并使用“日期”“描述”和引用的页面显示它们。

以下是一个例子:

\documentclass[a4paper]{report}

\usepackage{hyperref}
\usepackage{datatool} %pour créer des databases, surtout nécessaire pour les macros
\usepackage{ifthen}


\DTLnewdb{list} %important pour la commande \logg
\newcounter{logglabel}
\setcounter{logglabel}{0}
\newcommand\logg[2]{% fait une entree dans le labbook de type \logg{date}{résumé de ce qui a été fait}
  {\vspace{0.5cm}\large{#1}}%
  \stepcounter{logglabel}
  \label{\thelogglabel}
  \DTLnewrow{list}
  \DTLnewdbentry{list}{Date}{#1}
  \DTLnewdbentry{list}{Description}{#2}
  \DTLnewdbentry{list}{Page}{\pageref{\thelogglabel}}
}


\newcommand\showlogg{% fait un index avec toutes les entrées de \logg triées par date, avec pour infos date, résumé, et page de l'experience.
  \DTLsort{Date}{list}
  \DTLforeach*{list}{\date=Date,\desc=Description,\pa=Page}{\textbf{\date} \hspace{0.25cm} \desc \dotfill \pa \\}
}

\begin{document}

\chapter{My labbook}
\section{My first experiment}
Here is an experiment that I did on \logg{20171006}{I tried banana and coco}\\
I tried to grow banana but bananas wouldn't grow, I tried to grow coco but coco wouldn't grow.
\newpage %just to show what happens when both \logg are on different pages

\section{My second experiment}
Here is something I did on \logg{20171002}{I tried to grow apples and oranges}\\
Actually before bananas and coco I also tried apples and oranges.
\newpage

\section{The log of my experiments}
\showlogg

\end{document}

第 1 页第2页

我现在的问题是,当我\logg在文件中放入多个条目时,命令\showlogg会显示正确的日期、正确的描述,但总是显示最后一条条目的页面\logg。有没有办法确保页面指向正确的位置?

或者更一般地表述:是否可以创建一个命令,自动创建一个标签,其中标签内的标签(\label{tag})是递增的数字,并且\pageref之后使用的标签是完全相同的数字?

答案1

\DTLnewdbentry宏默认不扩展值(即第 3 个参数),因此\DTLnewdbentry{list}{Page}{\thelogglabel}总是会写入\thelogglabel列表,并且这将在列表显示的使用上进行扩展,使用当前值logglabel而不是定义时的值。

使用\dtlexpandnewvalue以便能够扩展值。

\stepcounter宏必须被替换为\refstepcounter

为了提供超链接,使用 提取锚点值\getrefbykeydefault{\thelogglabel}{anchor}

\\用空行替换。

\documentclass[a4paper]{report}

\usepackage{datatool} %pour créer des databases, surtout nécessaire pour les macros
\usepackage{ifthen}

\usepackage{hyperref}


\DTLnewdb{list} %important pour la commande \logg
\newcounter{logglabel}
\newcommand\logg[2]{% fait une entree dans le labbook de type \logg{date}{résumé de ce qui a été fait}
  {\vspace{0.5cm}\large{#1}}%
  \refstepcounter{logglabel}%
  \label{\thelogglabel}
  \DTLnewrow{list}
  \DTLnewdbentry{list}{Date}{#1}
  \DTLnewdbentry{list}{Description}{#2}
  \dtlexpandnewvalue
  \DTLnewdbentry{list}{Page}{\protect\hyperlink{\getrefbykeydefault{\thelogglabel}{anchor}{}}{\getpagerefnumber{\thelogglabel}}}
  \dtlnoexpandnewvalue
}


\newcommand\showlogg{% fait un index avec toutes les entrées de \logg triées par date, avec pour infos date, résumé, et page de l'experience.
  \DTLsort{Date}{list}
  \DTLforeach*{list}{\date=Date,\desc=Description,\pa=Page}{\textbf{\date} \hspace{0.25cm} \desc \dotfill \pa \\}
}

\begin{document}

\chapter{My labbook}
\section{My first experiment}
Here is an experiment that I did on \logg{20171006}{I tried banana and coco}

I tried to grow banana but bananas wouldn't grow, I tried to grow coco but coco wouldn't grow.

\clearpage%just to show what happens when both \logg are on different pages

\section{My second experiment}
Here is something I did on \logg{20171002}{I tried to grow apples and oranges}

Actually before bananas and coco I also tried apples and oranges.
\clearpage

\section{The log of my experiments}
\showlogg

\end{document}

在此处输入图片描述

相关内容