有没有办法计算文件中的条目数.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}
内容共names.idx
7条:
\indexentry{Euclid}{1}
\indexentry{Archimedes}{1}
\indexentry{Newton}{1}
\indexentry{Newton}{2}
\indexentry{Euler}{2}
\indexentry{Newton}{2}
\indexentry{Euclid}{2}
内容共places.idx
9条:
\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
因素很有趣!