我搜索了好久,但还没有找到解决方案。我正在使用 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}
我现在的问题是,当我\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}