我的文档经常引用 C 库函数。我编写了一个命令来对它们进行语义包装。
\newcommand{\cfunc}[2]
{
\texttt{#2}
\footnote{See \texttt{man #1 #2}.}
\index{#2}
}
The \cfunc{3}{malloc} function allocates memory...
这样做效果很好,但如果同一函数在一页上被多次提及,我会得到多个脚注。我想\cfunc
在每次提及时使用相同的包装器,以便索引正确,但我希望仅当这是该页面上给定函数名称的第一个脚注时才生成脚注。
我该怎么做呢?
答案1
此解决方案确保\cname
宏跟踪已使用的标签,方法是将它们存储到缓冲区中——当页面被发送出去以使该功能按页面工作时,该缓冲区会被清空。如果当前标签(即的第二个参数)\cname
已存在于缓冲区中,我们就知道不应生成脚注:
\documentclass{article}
\usepackage{everyshi}
\makeatletter
\def\cfunc@buffer{}
\def\check@buffer#1#2{\ifx#1#2\@tempswafalse\fi}
\newcommand{\cfunc}[2]{%
\@tempswatrue
\edef\@tempa{#2}%
\@for\lbl:=\cfunc@buffer\do{\check@buffer\lbl\@tempa}%
\texttt{#2}%
\if@tempswa\footnote{See \texttt{man #1 #2}.}\fi
\index{#2}%
\xdef\cfunc@buffer{#2,\cfunc@buffer}%
}
\EveryShipout{\global\let\cfunc@buffer\@empty}
\makeatother
\begin{document}
The \cfunc{3}{malloc} function allocates memory...
The \cfunc{3}{malloc} function allocates more memory...
The \cfunc{3}{foo} function doesn't even exist...
\clearpage
The \cfunc{3}{malloc} function allocates some memory again...
\end{document}
附录
以下是有关实施的一些细节:
首先初始化一个宏,它将作为已用到该宏的标签的存储\cname
。然后定义一个辅助宏。
\def\cfunc@buffer{}
\def\check@buffer#1#2{\ifx#1#2\@tempswafalse\fi}
\cname
然后通过首先让开关 ie \if@tempswa
(在 LaTeX 内核中预定义)设置为“true”并将当前标签存储到(也预定义的存储)宏中来设置的定义\@tempa
。
\newcommand{\cfunc}[2]{%
\@tempswatrue
\edef\@tempa{#2}%
现在我们检查当前标签是否已经存在于缓冲区中。
\@for\lbl:=\cfunc@buffer\do{\check@buffer\lbl\@tempa}%
如果是,则将开关\if@tempswa
设置为“false”(参见 的定义\check@buffer
)。现在,基于此,我们可以按计划输出信息——只有当前标签不在存储列表中时,才会出现脚注。
\texttt{#2}%
\if@tempswa\footnote{See \texttt{man #1 #2}.}\fi
\index{#2}%
最后,但是真的尤其是当前标签被写入存储中:
\xdef\cfunc@buffer{#2,\cfunc@buffer}%
}
笔记。如果您需要在页面之外的其他层上进行操作,例如在\section
s 上,您需要通过挂接到宏来刷新缓冲区\section
,如
\let\ltx@section\section
\renewcommand\section{\let\cfunc@buffer\@empty\ltx@section}
完整的测试文件
\documentclass{article}
\makeatletter
\def\cfunc@buffer{}
\def\check@buffer#1#2{\ifx#1#2\@tempswafalse\fi}
\newcommand{\cfunc}[2]{%
\@tempswatrue
\edef\@tempa{#2}%
\@for\lbl:=\cfunc@buffer\do{\check@buffer\lbl\@tempa}%
\texttt{#2}%
\if@tempswa\footnote{See \texttt{man #1 #2}.}\fi
\index{#2}%
\xdef\cfunc@buffer{#2,\cfunc@buffer}%
}
\let\ltx@section\section
\renewcommand\section{\let\cfunc@buffer\@empty\ltx@section}
\makeatother
\setlength\parindent{0pt}
\begin{document}
\section{C functions}
The \cfunc{3}{malloc} function allocates memory...
The \cfunc{3}{malloc} function allocates more memory...
The \cfunc{3}{foo} function doesn't even exist...
\section{more C functions}
The \cfunc{3}{malloc} function allocates some memory again...
\end{document}