以下是最小示例:
\documentclass[12pt]{article}
\usepackage{makeidx}
\makeindex
\begin{document}
A\index{7B} simple\index{5} example \index{9} showing\index{7} the problem
\printindex
\end{document}
生成此索引:
我希望“7B”列在 7 和 9 之间。我知道只需使用 即可实现这一点\index{7@7B}
,但不幸的是,我不能使用这种方法(事实上,我有\footcite[7B]{ref}
,请参阅下面的更真实的最小示例)
有没有一种通用的方法可以解决这个问题,通过某种方式告诉“makeindex”以我想要的方式解释数字后的字母?
PS:我的真实来源与此类似:
\documentclass[12pt]{article}
\usepackage[backend=biber,style=oscola,indexing=cite]{biblatex}
\addbibresource{refs.bib}
\usepackage[style=british]{csquotes}
\usepackage[splitindex]{imakeidx}
\indexsetup{noclearpage}
\DeclareIndexAssociation{leg}{tableg}
\makeindex[name=tableg,%
title={Table of Legislation},%
options=-s oscola -c -l,%
columns=1]
\begin{document}
A\footcite[5]{sale} minimal \footcite[7]{sale}
example\footcite[7B]{sale} showing\footcite[9]{sale}
the problem.
\printindex[tableg]
\end{document}
在 refs.bib 中我有:
@legislation{sale,
title = {Sale of Goods Act},
date = {1979},
keywords = {leg,en},
entrysubtype = {primary},
pagination = {section},
tabulate = {tableg}
}
得出的结果为:
答案1
在我的特殊情况下(使用 OSCOLA BibLaTeX 样式),可以通过更改来解决问题
\footcite[7B]{sale}
到
\DNI\footcite[7B]{sale}
\index[tableg]{Sale of Goods Act1979@\citeinindex {sale}!8@ s 7B}
(该\DNI
命令禁止引用,稍后通过命令手动引入\index
;顺便说一下,这出现在 BL-OSCOLA 样式文档中,但那里的例子有一个额外的空白,这就是为什么一开始我无法让这个解决方案发挥作用)
无论如何,找到此类问题的通用解决方案就好了。
答案2
一个通用的解决方案是建立一个正则表达式,将索引项视为一组字段,如电话号码、DOI 或 IP 地址(或者甚至是邮政地址),以便 V64 位于 V128 之前。
这样的解决方案应该位于工具链的哪个位置?正则表达式可以makeindex
通过其sort_rule
指令在索引样式文件 (.ist) 中使用;正则表达式在 expl3 中可用;也可能在 lua 代码中可用。
但是 Xindy 已经知道如何做到这一点(在其/texmf-dist/xindy/modules/base/numeric-sort.xdy
模块中)。
那么让我们看看 xindy 解决方案是什么样的。
A
将一些其他索引条目插入x\index{V64}x\index{V128}
到测试文件中,我们得到以下结果(latex 需要使用 shell-escape 运行,以便 xindy 可以创建其工作文件):
到目前为止一切顺利:2
在之前12
,等等。
插入章节编号,例如\index[s]{s 7B}
,用于单独索引s给出:
也不错。(样式文件中的样式和布局xm-statute.xdy
仅供参考。)
平均能量损失
\begin{filecontents*}[overwrite]{xm-statute.xdy}
(markup-locclass-list :open ": ")
(define-letter-group "Notes" :prefixes ("~b") :before "default")
(merge-rule "Note" "~b")
(markup-letter-group
:open-head "~n {\setlength{\fboxsep}{5pt}\rmfamily\itshape\large\colorbox{yellow!20}{\textcolor{green!40!blue}{\hbox to \dimexpr\linewidth-2\fboxsep{
\hfill " ; space is needed
:close-head "\hfill}}~n}}"
:group "Notes")
(markup-letter-group
:open-head "~n {\setlength{\fboxsep}{5pt}\sffamily\bfseries\large\colorbox{blue!30}{\textcolor{yellow!90!red!5}{\hbox to \dimexpr\linewidth-2\fboxsep{
\hfill " ; space is needed
:close-head "\hfill}}\nopagebreak\vspace{2mm}}}"
)
(markup-locclass-list :open "\dotfill" :sep "")
\end{filecontents*}
\begin{filecontents*}[overwrite]{xm-generic.xdy}
(markup-letter-group
:open-head "~n {\fbox{\textcolor{red!65}{"
:close-head "\hfill}}\nopagebreak\vspace{2mm}}"
)
(markup-locclass-list :open "\dotfill" :sep "")
\end{filecontents*}
\documentclass{article}
\usepackage{xcolor}
\usepackage{fontspec}
\setmainfont{Noto Serif}
\usepackage[hyperindex=false,colorlinks]{hyperref}
\usepackage{imakeidx}
\makeindex[title=Xindy--manual: general,
program=texindy,
options=
-M xm-generic.xdy
-C utf8
,
columnseprule,
]
\makeindex[name=s,title=Statutes,
program=truexindy,
options=
-L korean
-M texindy.xdy
-M numeric-sort.xdy
-M xm-statute.xdy
-C utf8
,
columnseprule,
]
\begin{document}
x\index{aardvark}
x\index[s]{Note!xindy!manual}
\newpage
x\index{10.2.250.1}
x\index{10.12.9.12}
x\index{60.12.251.12}
x\index{10.2.250.1}
x\index{128.12.250.12}
x\index{128.1.250.2}
x\index{V64}x\index{V128}
x\index[s]{s 7}x\index[s]{s 7B}x\index[s]{s 50}x\index[s]{s 5}x\index[s]{s 3(2)(a)}
x\index[s]{SOGA!s 7}x\index[s]{SOGA!s 7B}x\index[s]{SOGA!s 50}x\index[s]{SOGA!s 5}x\index[s]{SOGA!s 3(2)(a)}
x\index{zebra}
x\index{index!xindy!manual}
x\index[s]{index!name!s}
End.
\printindex
\printindex[s]
\end{document}
乙
添加oscola
可得到一个一般(即未命名)的索引:
一切都进展顺利。
legislation
第一次(lua)latex 运行后,单独的索引显示:
因此,号码布信息正在传播。
运行 biber 然后再次运行 latex 填充数据:
一切看起来都已整理好。(;))
平均能量损失
%==========================================
\begin{filecontents*}[overwrite]{\jobname.bib}
@legislation{sale,
title = {Sale of Goods Act},
date = {1979},
keywords = {leg,en},
entrysubtype = {primary},
pagination = {section},
%tabulate = {tableg}
}
\end{filecontents*}
%==========================================
\begin{filecontents*}[overwrite]{oscola-dev.xdy}
(markup-locclass-list :open ": ")
(define-letter-group "Notes" :prefixes ("~b") :before "default")
(merge-rule "Note" "~b")
(markup-letter-group
:open-head "~n {\setlength{\fboxsep}{5pt}\rmfamily\itshape\large\colorbox{yellow!20}{\textcolor{green!40!blue}{\hbox to \dimexpr\linewidth-2\fboxsep{
\hfill " ; space is needed
:close-head "\hfill}}~n}}"
:group "Notes")
(markup-letter-group
:open-head "~n {\setlength{\fboxsep}{5pt}\sffamily\bfseries\large\hbox to \dimexpr\linewidth-2\fboxsep{
\hfill " ; space is needed
:close-head "\hfill}}\nopagebreak\vspace{2mm}"
)
(markup-locclass-list :open "\dotfill" :sep "")
\end{filecontents*}
%==========================================
\begin{filecontents*}[overwrite]{xm-generic.xdy}
(markup-letter-group
:open-head "~n {\fbox{\textcolor{red!65}{"
:close-head "\hfill}}\nopagebreak\vspace{2mm}}"
)
(markup-locclass-list :open "\dotfill" :sep "")
\end{filecontents*}
%==========================================
\documentclass{article}
\usepackage{xcolor}
\usepackage{fontspec}
\setmainfont{Noto Serif}
\usepackage[backend=biber,style=oscola,indexing=cite]{biblatex}
\addbibresource{\jobname.bib}
\usepackage[style=british]{csquotes}
\usepackage[hyperindex=false,colorlinks]{hyperref}
\usepackage{imakeidx}
\makeindex[title=Xindy--oscola-dev: general,
program=texindy,
options=
-M xm-generic.xdy
-C utf8
,
columnseprule,
]
\makeindex[name=legislation,title=Table of Statutes,
program=texindy,
options=
-M oscola-dev.xdy
-C utf8
,
columns=1,
]
\DeclareIndexAssociation{enprimleg}{legislation}
\begin{document}
A\footcites[5]{sale}[21C]{sale} minimal \footcite[7]{sale} x\footcite[21]{sale}
example%\footcite[7B]{sale}
%\DNI
\footcite[7B]{sale}
showing\footcite[9]{sale}
the problem.\footcite[3(2)(a)]{sale}
x\index{aardvark}
x\index[legislation]{Note!xindy!oscola-dev}
\newpage
x\index{10.2.250.1}
x\index{10.12.9.12}
x\index{60.12.251.12}
x\index{10.2.250.1}
x\index{128.12.250.12}
x\index{128.1.250.2}
x\index{V64}x\index{V128}
x\index{zebra}
x\index{index!xindy!oscola-dev}
\index[legislation]{Test entry}
\index[legislation]{SOGA|see{\citeinindex{sale}}}
x\footcites[5]{sale}[21C]{sale}
\index[legislation]{index!name!legislation}
End.
\printindex
\printindex[legislation]
\end{document}
C
现在,我们转入生产模式,换上更符合我们风格的朴素服装,我们的总体指数相当整洁地变成了:
以及立法:
但现在我们有一个不同的问题:当所有信息已知时,legislation.ind
文件是在\printindex[legislation]
文件末尾生成的。.tex
.ind
我们需要在下一次运行开始时获取该文件,但它只是数据,应用了默认索引名称、字体和布局:
因此我们需要应用类似 bl-oscola 的\printindexearly
命令来获取所有格式。
并将其打印在预期的位置,靠近文档的前面。
幸运的是,bl-oscola 的维护者,作为卓越的代表,已经投入了所有的艰苦工作,思考、设计、实施(我的意思是,艰苦);因此,我们所要做的就是将一个宏中的一行代码从 更改为\@input@{\jobname-#1.ind}
,\@input@{#1.ind}
然后所有的格式流将变成: