宏中的标签和页码?

宏中的标签和页码?

我正在写一份很长的文档,并且我编写了一个小宏来跟踪我想要回顾的各种事情 - 例如,如果我想继续写,但我知道我写的东西需要引用,我可以直接插入\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 的建议从 切换到 得到解决\csdefcsedef我还遇到了另一个问题,即\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

相关内容