计数索引条目

计数索引条目

有没有办法计算文件中的条目数.idx?目前,我正在使用以下方法完成这项工作,但我想知道是否有一种全 TeX/LaTeX 方式来完成同样的事情。如果有的话,我就不必在构建过程中运行“计数”。以下是代码:

#!/usr/bin/perl
# Count.pl -- generate index count info for tex
use strict;
use warnings;
use diagnostics;

our $VERSION = '0.04';

UpdateLines('names.tex',NLines($ARGV[0] . '.idx'));
UpdateLines('places.tex',NLines('places.idx'));

sub NLines {
    my $filename = shift;
    my @f;
    my $fh;

    open($fh, '<', $filename);
    @f = <$fh>;
    return scalar @f;
}

sub UpdateLines {
    my $filename = shift;
    my $lines = shift;
    my $fh;

    open($fh, '>', $filename);
    print $fh "There are $lines entries in this index.\n";
}

当我写这篇文章时,我突然想到,由于我使用一组宏来索引各种形式的名称和地点,因此我可以添加必要的内容来增加明显的计数器inline。如果其他人有更好的想法,请加入。如果没有,并且我设法拼凑了一些东西,那么我会将其作为答案发布,以防其他人也有这种情况counting compulsion。强迫症严重吗?

答案1

您可以更改\item命令以增加计数器,然后更改\endtheindex命令以显示计数器值(并将计数器重置为零以供下一个索引):

\documentclass{book}
\usepackage{etoolbox}

\usepackage{imakeidx}
\makeindex[name=names,title=Index of Names]
\makeindex[name=places,title=Index of Places]

\makeatletter
% in the index, \item is \@idxitem
\appto{\@idxitem}{\stepcounter{itemcount}}
% Show the counter's value at the end and reset the counter
\appto{\endtheindex}{%
  \noindent\fbox{This index had \theitemcount~items}\par
  \setcounter{itemcount}{0}}

\newcounter{itemcount}
\makeatother

\begin{document}
\mainmatter
\chapter{A}
\index[names]{Euclid}
\index[places]{Alexandria}

\index[names]{Archimedes}
\index[places]{Syracuse}

\index[names]{Euler}
\index[places]{Basel}
\index[places]{Berlin}
\index[places]{St. Peterburg}

\index[names]{Newton}
\index[places]{Cambridge}


\backmatter

\printindex[names]
\printindex[places]

\end{document}

在此处输入图片描述

在此处输入图片描述

答案2

尝试回答原始问题。.idx 文件中的条目数通过以下\input命令计算:

\documentclass[oneside]{book}
\usepackage{imakeidx}
\def\CountIndexOccurrences#1{%
\expandafter\newcount\csname #1\endcsname%
\expandafter\newcount\csname #1\endcsname%
\def\indexentry##1##2{\expandafter\advance\csname #1\endcsname 1}%
\IfFileExists{#1.idx}{\input{#1.idx}}{}%
}
\CountIndexOccurrences{names}
\CountIndexOccurrences{places}
\def\TotalBox#1{%
\fbox{There are \expandafter\the\csname #1\endcsname\ occurrences 
of items from this index}\par}
\makeindex[name=names,title=Index of Names]%
\makeindex[name=places,title=Index of Places]%
\begin{document}
\mainmatter
\chapter{A}
Euclid\index[names]{Euclid}
(Alexandria\index[places]{Alexandria})

Archimedes\index[names]{Archimedes}
(Syracuse\index[places]{Syracuse})

Newton\index[names]{Newton}
(Cambridge\index[places]{Cambridge})

\newpage
Newton\index[names]{Newton}
(Cambridge\index[places]{Cambridge})

Euler\index[names]{Euler}
(Basel\index[places]{Basel},
Berlin\index[places]{Berlin},
St. Peterburg\index[places]{St.~Peterburg})

Newton\index[names]{Newton}
(Cambridge\index[places]{Cambridge})

Euclid\index[names]{Euclid}
(Alexandria\index[places]{Alexandria})

\backmatter

\printindex[names]
\TotalBox{names}
\printindex[places]
\TotalBox{places}
\end{document}

第 1 页 第2页 姓名索引 地点索引

内容共names.idx7条:

\indexentry{Euclid}{1}
\indexentry{Archimedes}{1}
\indexentry{Newton}{1}
\indexentry{Newton}{2}
\indexentry{Euler}{2}
\indexentry{Newton}{2}
\indexentry{Euclid}{2}

内容共places.idx9条:

\indexentry{Alexandria}{1}
\indexentry{Syracuse}{1}
\indexentry{Cambridge}{1}
\indexentry{Cambridge}{2}
\indexentry{Basel}{2}
\indexentry{Berlin}{2}
\indexentry{St.~Peterburg}{2}
\indexentry{Cambridge}{2}
\indexentry{Alexandria}{2}

答案3

正如我在问题正文中所说的那样,这是我 8 小时前想到的解决方案(本来会发布,但我的链接tex.stackexchange.com已关闭。除此之外,这是我的反中立代码:

%%
%% Indexing Macros
%%
\newcounter{Names}
\newcounter{Places}
\newcommand{\incNames}{\addtocounter{Names}{1}}
\newcommand{\incPlaces}{\addtocounter{Places}{1}}
\newcommand\IA[3]{\incNames #1\index{#2!#3}}
\newcommand\IAA[3]{\incNames #1\index{#2 (#3)}}
\newcommand\IM[4]{\incNames #1\index{#2!#3, (#4.)}}
\newcommand\IS[1]{\incNames #1\index{#1 \ding{45}}}
\newcommand\PI[1]{\incPlaces #1\index[places]{#1 \ding{45}}}
\newcommand\PIA[2]{\incPlaces #1\index[places]{#1, (\SCA{#2})}}
\newcommand\PIAA[3]{\incPlaces #1\index[places]{#2, (\SCA{#3})}}
\newcommand\PO[3]{\incPlaces #1\index[places]{#1, (\SCA{#2})|{\emph{\small #3}}}}
\newcommand\SCA[1]{\textsc{\MakeLowercase{#1}}}

从 开始\IA,是修改后的原件。现在它已经存在,这一点非常明显,让我怀疑我解决问题的能力 :( 显然我需要更多练习来回答问题——问题很简单,需要回到答案!顺便说一句,看到这个修改提高了这个self-documentation因素很有趣!

相关内容