![使用词汇表的排序顺序错误(似乎忽略了排序键)](https://linux22.com/image/350738/%E4%BD%BF%E7%94%A8%E8%AF%8D%E6%B1%87%E8%A1%A8%E7%9A%84%E6%8E%92%E5%BA%8F%E9%A1%BA%E5%BA%8F%E9%94%99%E8%AF%AF%EF%BC%88%E4%BC%BC%E4%B9%8E%E5%BF%BD%E7%95%A5%E4%BA%86%E6%8E%92%E5%BA%8F%E9%94%AE%EF%BC%89.png)
对于我的博士论文,我使用 Nicola Talbot 的词汇表包来创建多个词汇表 - 包括我在论文中引用的法院判决列表。
在上述法院判决列表中,我希望按法院名称和判决日期对它们进行排序(给定格式:DD.MM.YYYY)。因此,我使用 xstring 包创建排序键(格式为“Court-YYYY-MM-DD”),并将其作为排序键传递到 \newglossaryentry 命令中(通过我的宏 \decision{key}{shortinfo}{longinfo})。
以下示例中的排序键为:
BGH-2000-12-08
BGH-2003-01-09
BGH-2010-10-05
我使用我的 latex 引擎中的以下 bash 脚本制作索引
for file in *-glo ; do
makeindex -t ${file%-glo}-glg -s $docname.ist -o ${file%-glo}-gls $file
done
不幸的是,打印出来的决策词汇表似乎忽略了排序键。决策条目似乎仍然只使用词汇表条目描述进行排序。
以下最小示例的输出显示为
BGH, Urteil vom 05.10.2010, Az. V ZR 228/09, Online-Entscheidungsdatenbank des BGH.
BGH, Urteil vom 08.12.2000, Az. V ZR 482/99, Online-Entscheidungsdatenbank des BGH.
BGH, Urteil vom 09.01.2003, Az. VII ZR 181/00, NJW 2003, 1188.
代替
BGH, Urteil vom 08.12.2000, Az. V ZR 482/99, Online-Entscheidungsdatenbank des BGH.
BGH, Urteil vom 09.01.2003, Az. VII ZR 181/00, NJW 2003, 1188.
BGH, Urteil vom 05.10.2010, Az. V ZR 228/09, Online-Entscheidungsdatenbank des BGH.
最小示例:
\usepackage{xstring}
\usepackage[toc=true]{glossaries}
\newglossary[decision-glg]{decision}{decision-gls}{decision-glo}{Decisions}
\makeglossaries
% Macro to create sort key
\newcommand{\getCourt}[1]{\StrBefore[1]{#1}{,}}
\newcommand{\getYear}[1]{\StrBetween[2,2]{#1}{.}{,}}
\newcommand{\getMonth}[1]{\StrBetween[1,2]{#1}{.}{.}}
\newcommand{\getDay}[1]{\StrBetween[1,1]{#1}{vom }{.}}
\newcommand{\getsortstring}[1]{\getCourt{#1}-\getYear{#1}-\getMonth{#1}-\getDay{#1}}
\newcommand{\justprint}[1]{#1}
% Manipulate sorting
\let\courtdate\justprint
\renewcommand{\glsprestandardsort}[3]{%
\ifdefstring{#2}{decision}{%
\let\courtdate\getsortstring%
\edef#1{\expandafter\expandonce\expandafter{#1}}%
\let\courtdate\justprint%
\glsdosanitizesort%
}{%
\glsdosanitizesort%
}%
}
% Macro to add decisions as glossary entry: \decision{key}{shortinfo}{longinfo}
\newcommand{\decision}[3]{%
\newglossaryentry{#1}{type=decision, name={#2}, description={#3}, sort={\getsortstring{#3}}}%
}
% Create new style for the glossary
\newglossarystyle{decisionlist}{%
\renewenvironment{theglossary}{\begin{spacing}{1.5}}{\end{spacing}}%
\renewcommand*{\glossaryheader}{}%
\renewcommand*{\glsgroupheading}[1]{}%
\renewcommand*{\glossentry}[2]{%
\noindent% No left padding
\textbf{% Make bold
\StrBefore{\glossentrydesc{##1}}{,}% Insert court name
},% Add comma
\StrBehind{\glossentrydesc{##1}}{,}.% Insert decision info
\\}% Insert newline after entry
\renewcommand*{\subglossentry}[3]{}%
\renewcommand*{\glsgroupskip}{}%
}
% Add decisions as glossary entries using the above macro
\decision{BGH, V ZR 482/99}{BGHZ-Online, V ZR 482/99}{BGH, Urteil vom 08.12.2000, Az. V ZR 482/99, Online-Entscheidungsdatenbank des BGH}
\decision{BGH, VII ZR 181/00}{BGH, NJW 2003, 1188}{BGH, Urteil vom 09.01.2003, Az. VII ZR 181/00, NJW 2003, 1188}
\decision{BGH, V ZR 228/09}{BGHZ-Online, V ZR 228/09}{BGH, Urteil vom 05.10.2010, Az. V ZR 228/09, Online-Entscheidungsdatenbank des BGH}
\begin{document}
\setglossarystyle{decisionlist}
\printglossary[type=decision]
I am citing all of the above decisions. Those are \gls{BGH, V ZR 482/99}, \gls{BGH, V ZR 228/09} and \gls{BGH, VII ZR 181/00}.
由于我现在已经尝试了很长时间,以弄清楚为什么尽管我传递了排序键,但条目仍然以错误的顺序显示,如果有人可以指引我,我会非常高兴:)
答案1
如果你查看该.decision-glo
文件,你可以看到该键的值sort
。第一行是:
\glossaryentry{\getCourt {BGH, Urteil vom 08.12.2000, Az. V ZR 482/99, Online-Entscheidungsdatenbank des BGH}-\getYear {BGH, Urteil vom 08.12.2000, Az. V ZR 482/99, Online-Entscheidungsdatenbank des BGH}-\getMonth {BGH, Urteil vom 08.12.2000, Az. V ZR 482/99, Online-Entscheidungsdatenbank des BGH}-\getDay {BGH, Urteil vom 08.12.2000, Az. V ZR 482/99, Online-Entscheidungsdatenbank des BGH}?\glossentry{BGH, V ZR 482/99}|setentrycounter[]{page}\glsnumberformat}{1}
所以sort
值还没有被扩展。我们可以添加一些\show
代码来找出发生了什么:
\renewcommand{\glsprestandardsort}[3]{%
\ifdefstring{#2}{decision}{%
\let\courtdate\getsortstring%
\show#1%
\edef#1{\expandafter\expandonce\expandafter{#1}}%
\show#1%
\let\courtdate\justprint%
\glsdosanitizesort%
}{%
\glsdosanitizesort%
}%
}
第一个\show#1
产生:
> \@glo@sort=macro:
->\getsortstring {BGH, Urteil vom 08.12.2000, Az. V ZR 482/99, Online-Entscheid
ungsdatenbank des BGH}.
第二个结果是:
> \@glo@sort=macro:
->\getCourt {BGH, Urteil vom 08.12.2000, Az. V ZR 482/99, Online-Entscheidungsd
atenbank des BGH}-\getYear {BGH, Urteil vom 08.12.2000, Az. V ZR 482/99, Online
-Entscheidungsdatenbank des BGH}-\getMonth {BGH, Urteil vom 08.12.2000, Az. V Z
R 482/99, Online-Entscheidungsdatenbank des BGH}-\getDay {BGH, Urteil vom 08.12
.2000, Az. V ZR 482/99, Online-Entscheidungsdatenbank des BGH}.
所以这里的扩展出了问题。如果的参数\getsortstring
总是采用以下形式法庭, Urteil vom
日。毫米。年,
其余的那么这是另一种方法:
\def\parsesortstring#1,#2vom #3.#4.#5,#6\endparsesortstring{#1-#5-#4-#3}
\newcommand{\getsortstring}[1]{\parsesortstring#1\endparsesortstring}
% Manipulate sorting
\let\courtdate\justprint
\renewcommand{\glsprestandardsort}[3]{%
\ifdefstring{#2}{decision}{%
}{%
\glsdosanitizesort%
}%
}
这只是删除了\glsdosanitizesort
类型decision
,允许排序值在写入外部文件时完全展开。第一行.decision-glo
现在是:
\glossaryentry{BGH-2000-12-08?\glossentry{BGH, V ZR 482/99}|setentrycounter[]{page}\glsnumberformat}{1}
具有正确的排序值BGH-2000-12-08
。