我正在写一份很长的文档,并且我编写了一个小宏来跟踪我想要回顾的各种事情 - 例如,如果我想继续写,但我知道我写的东西需要引用,我可以直接插入\needcite{Cite that paper from Smith et al.}
。然后在文档的末尾,我有一个宏,它列举了所有这些内容,并链接到我在文档中放置它们的位置。
我有两个相关且紧迫的问题。首先,我无法让标签正常工作。我以编程方式生成标签名称,当它们被标记时和被引用时的方式相同,但它们似乎永远无法找到彼此。标签的生成和引用方式如下:
\newcommand{\gettextref}[2]{textref#2:#1} % Gets the name of the label of the
% #1-th item in the #2 reflist.
\newcommand{\addtext}[2]{% Add item #1 to list #2.
\refstepcounter{tlctr#2}\label{\gettextref{#1}{#2}}%
\csdef{text#2\arabic{tlctr#2}}{#1 (pp. \arabic{page})}%
}
我已经修复了错误的标签部分,以下是修复后的代码:
\newcommand{\gettextref}[2]{textref#2:#1} % Gets the name of the label of the
% #1-th item in the #2 reflist.
\newcommand{\addtext}[2]{% Add item #1 to list #2.
\refstepcounter{tlctr#2}\label{\gettextref{\arabic{tlctr#2}}{#2}}%
\csdef{text#2\arabic{tlctr#2}}{#1 (pp. \arabic{page})}%
}
第二,我一直在保存页码,所以至少我知道这些东西在哪里,所以上面例子中的文本会生成字符串“引用 Smith 等人的论文(第 104 页)”。但是,似乎环境中定义的宏是在\csdef
使用检索文本时执行的\csuse
,而不是在生成文本时执行的。
在实践中,它的使用方式如下:
% NeedCite - Keep track of places where you need to add citations.
\textlist{CitationsNeededList}
% \needcite{Note} - Adds the current location to the list of locations needing a citation, with
% the note Note. This can then be retrieved using \gettext
\newcommand{\needcite}[1] {%
\addtext{#1}{CitationsNeededList}\hyperlink{todolist:CiteList}{{\scriptsize $^{\textit{[Cite]}}$}}
}
\newcommand{\listneededcitations} {%
\label{todolist:CiteList}%
\getalltextreferenced{CitationsNeededList}%
}
由于\label{todolist:CiteList}
在其他引用之后使用,我通常会运行 xelatex 两次,这样引用就已经被定义了,但无济于事。指向的超链接todolist:CiteList
和指向的超链接\gettextref{n}{CitationsNeededList}
都找不到引用。
下面是一个 MWE。它生成一个 4 页的文档,每页都有一个未引用的脚注。第 4 页生成所需的引用列表。至少在我的版本中,找不到参考文献,因此\ref{\gettextref{1}{CitationsNeededList}}
返回 ( ??
)。
\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage{etoolbox}
\newcommand{\textlist}[1]{ % Create a text list with name #1
\newcounter{tlctr#1}
\setcounter{tlctr#1}{0}
}
\newcommand{\gettextref}[2]{textref#2:#1} % Gets the name of the label of the
% #1-th item in the #2 reflist.
\newcommand{\addtext}[2]{% Add item #1 to list #2.
\refstepcounter{tlctr#2}\label{\gettextref{\arabic{tlctr#2}}{#2}}%
\csdef{text#2\arabic{tlctr#2}}{#1 (pp. \thepage)}%
}
\newcommand{\getnumstrings}[1]{% Check how many strings are in list #1
\value{tlctr#1}%
}
\newcommand{\getnstrings}[1]{% Because \value is not human-readable.
\arabic{tlctr#1}%
}
\newcommand{\gettext}[2]{% Gets the text of #1 from list #2.
\csuse{text#2#1}%
}
\newcounter{tempcnti} % A temporary counter, for use in \getalltextreferenced.
% Needs to be defined outside of the loop because
% LaTeX doesn't like it if you try to define the same counter twice.
\newcommand{\getalltextreferenced}[1]{% Get all text in list #1 in a referenced list.
\setcounter{tempcnti}{0}
\begin{itemize}
\whileboolexpr
{ test {\ifnumcomp{\thetempcnti}{<}{\value{tlctr#1}}}}%
{\stepcounter{tempcnti}%
\item[\hyperlink{\gettextref{\thetempcnti}{#1}}{\arabic{tempcnti}}]\gettext{\thetempcnti}{#1} (\ref{\gettextref{\thetempcnti}{#1}})}%
\end{itemize}%
}
% NeedCite - Keep track of places where you need to add citations.
\textlist{CitationsNeededList}
% \needcite{Note} - Adds the current location to the list of locations needing a citation, with
% the note Note. This can then be retrieved using \gettext
\newcommand{\needcite}[1] {%
\addtext{#1}{CitationsNeededList}\hyperref[todolist:CiteList]{{\scriptsize $^{\textit{[Cite]}}$}}
}
\newcommand{\listneededcitations} {%
\label{todolist:CiteList}%
\getalltextreferenced{CitationsNeededList}%
}
\begin{document}
This is an uncited statement.\needcite{Remember to cite this.}
\newpage
This is a cited statement\needcite{This is clearly a lie, or I'd have a citation here.}
\newpage
This is a third statement on a different page.\needcite{Third statement.}
\newpage
\listneededcitations
\end{document}
如果您感兴趣的话,以下是日志中有关缺少参考的部分:
LaTeX Warning: Reference `textrefCitationsNeededList:1' on page 4 undefined on
input line 66.
LaTeX Warning: Reference `textrefCitationsNeededList:2' on page 4 undefined on
input line 66.
LaTeX Warning: Reference `textrefCitationsNeededList:3' on page 4 undefined on
input line 66.
编辑:从 切换\hyperlink{}{}
到似乎至少允许我从缺少参考\hyperref[]{}
的\needcite{}
位置链接到参考列表。出于某种原因,\item[]
似乎不喜欢\hyperref[]{}
在其中有一个。
编辑 2:我搞清楚了标签的问题所在 - 在 \addtext 中,它将注释设置为标签,而不是计数器值。仍然不确定页面问题
最终编辑:现在所有问题都已解决,还有一个问题。我想我会向大家通报,以防他们以后计划做类似的事情。页码问题已通过 egreg 的建议从 切换到 得到解决\csdef
。csedef
我还遇到了另一个问题,即\needcite{}
无法放置在\caption{}
环境中。我已经通过从 切换到 解决了这个问题\newcommand{\needcite}
。\DefineRobustCommand{\needcite}
希望这对未来对这种系统感兴趣的任何人有所帮助。
答案1
页码问题是由于
\newcommand{\addtext}[2]{% Add item #1 to list #2.
\refstepcounter{tlctr#2}\label{\gettextref{\arabic{tlctr#2}}{#2}}%
\csdef{text#2\arabic{tlctr#2}}{#1 (pp. \thepage)}%
}
因为\addtext{foo}{bar}
你基本上在做(假设计数器在\addtext
\expandafter\def\csname textbar3\endcsname{foo (pp. \thepage)
所以正确的做法是
\csedef{text#2\arabic{tlctr#2}}{#1 (pp. \thepage)}
这将把当前扩展\thepage
而不是宏放入替换文本中\thepage
。